Я программирую простой графический интерфейс, который должен выполнять 2 задачи:
1- импортировать набор данных для txt-файла
2- сделать некоторые вычисления с ранее импортированными данными
Обе задачи выполняются нажатием кнопки, по одной кнопке для каждой задачи.
Для кнопки «Загрузить данные» (задача 1) я использовал команду uiimport в обратном вызове этой кнопки (как описано здесь Matlab Calling «Импорт данных» с помощью кнопки GUI ):
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{:});
Что мне не хватает?
Всего 1 ответ
Вам нужно сохранить выход из первой функции где-нибудь, где вторая функция сможет получить к ней доступ. Обычно это делается путем сохранения его либо в каком-либо объекте UserData объекта ui, либо для хранения в некоторой специальной структуре хранения данных, прикрепленной к объектам фигуры, и к ней обращаются либо с guidata
функции guidata
, либо с guidata
функций getappdata
и setappdata
.
dat=guidata(hObj);
получает руководство от родительской фигуры hObj
guidata(hObj,dat);
устанавливает директивы родительской фигуры hObj
чтобы
Работая с гидом, структура направляющих по умолчанию заполняется структурой, содержащей все объекты ui, названные в честь их тега. При необходимости могут добавляться дополнительные поля. Аргумент handle
от обратных вызовов содержит guidata (hObj).
Три возможных варианта:
1. С рекомендациями
Храните загруженные данные с помощью руководств
function load_data_Callback(hObject, eventdata, handles)
% Load the file and save the result in variable S%
% Then: %
handles.S=S;
guidata(hObject,S);
Он будет автоматически загружен обратно в входную переменную
function pushbutton2_Callback(hObject, eventdata, handles)
assert(isfield(handles,S),'Load some data first!');
loaded_data=handles.S;
%...%
2. С свойством Userdata (до R2014a)
Храните загруженные данные в некоторые пользовательские данные uiobject, например pushbutton2
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');
%...%