【问题标题】:Matlab GUI programming: use data imported with uiimportMatlab GUI 编程:使用 uiimport 导入的数据
【发布时间】:2018-10-29 20:18:59
【问题描述】:

我正在编写一个简单的 GUI,它必须完成 2 个任务:

1-为一个txt文件导入一组数据

2- 使用之前导入的数据进行一些计算

两个任务都是按一个按钮来执行的,每个任务一个按钮。

对于“加载数据”按钮(任务 1),我在该按钮的回调中使用了 uiimport 命令(如此处所述 Matlab Calling 'Import Data' with GUI Button):

S = uiimport('-file');

数据作为“191384x3 双精度”加载。 我还修改了如下功能,以便让 S 可用于第二个按钮:

function S = load_data_Callback(hObject, eventdata, handles)

然后我按下第二个按钮来执行第二个任务。在我写的第二个按钮的回调中

function pushbutton2_Callback(hObject, eventdata, handles, S)

loaded_data = S; % to access the data in the non structured array
% Then I want to have 3 separate vectors out of the structure
v1 = loaded_data(:,1);       
v2 = loaded_data(:,2);     
v3 = loaded_data(:,3);

当我按下第二个按钮时,我收到一条错误消息:

Not enough input arguments.
loaded_data = S;
Error in gui_mainfcn (line 95)
    feval(varargin{:});

我错过了什么?

【问题讨论】:

标签: matlab user-interface


【解决方案1】:

您需要将第一个函数的输出存储在某个地方,以便第二个函数可以访问它。这通常通过将其存储在某个 ui 对象的 UserData 属性中来完成,或者存储在附加到图形对象的某些特殊数据存储结构中,并通过 guidata 函数或 getappdata 和 @ 访问987654324@函数。

dat=guidata(hObj);hObj父图获取guidata

guidata(hObj,dat);hObj的父图形的guidata设置为dat

使用指南,guidata 结构默认填充一个包含所有 ui 对象的结构,以它们的标签命名。可以根据需要添加额外的字段。回调中的 handle 参数包含 guidata(hObj)。

三种可能的实现方式:

1.使用 guidata

用guidata存储加载的数据

function load_data_Callback(hObject, eventdata, handles)
% Load the file and save the result in variable S%
% Then: %
handles.S=S;
guidata(hObject,S);

它将自动加载回handles输入变量中

function pushbutton2_Callback(hObject, eventdata, handles)
assert(isfield(handles,S),'Load some data first!');
loaded_data=handles.S;
%...%

2。具有 Userdata 属性(直到 R2014a)

将加载的数据存储到一些 uiobject UserData 中,例如按钮2

function load_data_Callback(hObject, eventdata, handles)
% Load the file and save the result in variable S%
% Then: %
set(handles.pushbutton2,'UserData',S,'Enable','on'); %You could disable pushbutton2 by default, until some data has been loaded

从 UserData 属性中恢复数据

function pushbutton2_Callback(hObject, eventdata, handles)

loaded_data=get(hObject,'UserData');
assert(~isempty(loaded_data),'Load some data first!');
%...%

3。使用 appdata 函数

setappdata

存储加载的数据
function load_data_Callback(hObject, eventdata, handles)
% Load the file and save the result in variable S%
% Then: %
setappdata(hObject,'loaded_data',S);

使用 getappdata 恢复:

function pushbutton2_Callback(hObject, eventdata, handles)
assert(isappdata(hObject,'loaded_data'),'Load some data first!');
loaded_data=getappdata(hObject,'loaded_data');
%...%

【讨论】:

  • userdata 已弃用,现在最好使用setappdatagetappdata。对于存储图形句柄以外的值,甚至建议使用guidata,最好只存储图形句柄结构。原则保持不变,因此您的答案仍然有效,但您可以重写一个更新的版本。
  • 从 R2018b 开始,所有这三种方法都由 Mathworks 记录为share data among callbacks 的一种方式。为了完整起见,我添加了一个带有 setappdata/getappdata 的示例。
猜你喜欢
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多