Ошибка при вызове локальной переменной в GUI MATLAB

Я получаю эту ошибку:

Error in ==> APP>pushbutton2_Callback at 109
img=imread(FileName)

Когда я пытаюсь использовать FileName в pushbutton2_Callback, я получаю сообщение об ошибке

FileName является переменной в pushbutton1_Callback.


person Achraf    schedule 27.05.2010    source источник


Ответы (2)


Вам нужно передать переменную FileName из одного обратного вызова в другой. Для этого вы можете присвоить переменную 'UserData' полю pushbutton1. Ваш код под pushbutton1_Callback должен выглядеть примерно так:

FileName=uigetfile();
set(handles.pushbutton1,'UserData',FileName);

Далее вам нужно прочитать переменную под вашим pushbutton2_Callback:

FileName=get(handles.pushbutton1,'UserData');
img=imread(FileName);

Если вы хотите проверить свои результаты, вы всегда можете не ставить точки с запятой в конце строк.

person Doresoom    schedule 27.05.2010

Существует общий метод хранения данных с вашим графическим интерфейсом для использования между обратными вызовами. Вы можете добавить произвольные поля в объект handles, чтобы вы могли добавить обратный вызов pushbutton1

handles.filename = FileName;
guidata(hObject,handles); 

Вторая строка представляет собой шаблонный код, который необходимо поместить в конце любого обратного вызова, который изменяет значения в структуре дескрипторов.

Теперь все ваши обратные вызовы будут иметь доступ к имени файла. В вашем конкретном случае при обратном вызове 2 у вас будет

img = imread(handles.filename);

Конечно, вы можете захотеть использовать это изображение позже в другой функции, чтобы вы могли сохранить его и в дескрипторах.

handles.img = img;
guidata(hObject, handles);
person Marc    schedule 28.05.2010
comment
Вы можете эффективно делать то же самое с setappdata и getappdata без необходимости запоминать бит guidata. - person Adrian; 28.05.2010
comment
Но тогда вы должны знать ручку фигуры, верно? Я думаю, вы могли бы вызвать gcf, но тогда вы столкнетесь с проблемой, если пользователь развернет другое окно до того, как ваш обратный вызов будет выполнен. В любом случае я предпочитаю точечную нотацию. - person Marc; 29.05.2010