我正在编写一个简单的GUI,它必须执行2个任务:
1-导入一组txt文件数据
2-使用先前导入的数据进行一些计算
两个任务都按一个按钮执行,每个任务一个按钮。
对于“加载数据”按钮(任务1),我在该按钮的回调中使用了uiimport命令(如此处Matlab Calling 'Import Data' with GUI Button所述):
S = uiimport('-file');
数据以“ 191384x3 double”的形式加载。 我还对函数进行了如下修改,以使第二个按钮可以使用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{:});
我想念什么?
答案 0 :(得分:2)
您需要将第一个函数的输出存储在某个地方,第二个函数将可以访问该输出。通常,可以通过将其存储在某些ui对象的UserData属性中或存储在附加到图形对象的特殊数据存储结构中来完成此操作,并可以使用guidata
函数或{{1 }}和getappdata
函数。
setappdata
从dat=guidata(hObj);
父图形获取guidata
hObj
将父图形guidata(hObj,dat);
的guidata设置为hObj
使用指南,默认情况下,guidata结构将填充一个包含所有ui对象(以其标记命名)的结构。可以根据需要添加其他字段。回调中的dat
参数包含guidata(hObj)。
三种可能的实现方式:
1。使用 guidata
使用guidata存储加载的数据
handle
它将自动重新加载到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
2。具有 Userdata 属性(最多R2014a)
将加载的数据存储到某些uiobject UserData中,例如按钮2
function pushbutton2_Callback(hObject, eventdata, handles)
assert(isfield(handles,S),'Load some data first!');
loaded_data=handles.S;
%...%
从UserData属性中恢复数据
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
3。使用 appdata 函数
使用 setappdata
存储加载的数据function pushbutton2_Callback(hObject, eventdata, handles)
loaded_data=get(hObject,'UserData');
assert(~isempty(loaded_data),'Load some data first!');
%...%
使用 getappdata 恢复:
function load_data_Callback(hObject, eventdata, handles)
% Load the file and save the result in variable S%
% Then: %
setappdata(hObject,'loaded_data',S);