Переменная Handles в GUIDE не обновляется

У меня есть графический интерфейс, созданный с использованием MATLAB GUIDE. Я пытаюсь вернуть значение из графического интерфейса. Вот соответствующие части кода (полный код можно найти здесь):

function varargout = test(varargin)

% --- Outputs from this function are returned to the command line.
function varargout = test_OutputFcn(hObject, eventdata, handles) 

    % Get default command line output from handles structure
    varargout{1} = handles.output;
    varargout{2} = handles.test;


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)

    handles.test = 'ok';

    % Update handles structure
    guidata(hObject, handles);

И как только я запускаю графический интерфейс, я получаю это сообщение об ошибке:

http://s11.postimage.org/5trvp5c83/Captura_de_tela_2012_08_06_a_s_12_25_55.png

Я нашел похожий вопрос в группе новостей MATLAB, но не нашел решение (и я прочитал весь документ guidata, как и было предложено).

Моя проблема в том, что я записал информацию в структуру "handles" в одной функции GUIDE и не могу получить эту информацию в другой функции.

Я пытался раскомментировать вызов UIWAIT в функции test_OpeningFcn, пытаясь дождаться пользователю закрыть окно.

% --- Executes just before test is made visible.
function test_OpeningFcn(hObject, eventdata, handles, varargin)

    % Choose default command line output for test
    handles.output = hObject;

    % Update handles structure
    guidata(hObject, handles);

    % UIWAIT makes test wait for user response (see UIRESUME)
    uiwait(handles.figure1);

После того, как я нажму кнопку, а затем попытаюсь взять переменную дескриптора. Но это тоже не работает и сбой с аналогичным сообщением об ошибке.

Любая помощь будет приветствоваться. Спасибо за внимание.


person jhonatanoliveira    schedule 07.08.2012    source источник


Ответы (3)


Проблема в том, что когда вы вызываете графический интерфейс как:

>> [a,b] = test()

этот вызов возвращается немедленно, поэтому в функции вывода вы пытаетесь получить доступ к handles.test, которого еще не существует, что вызывает ошибку.

Существует скринкаст Дуга Халла, показывающего, как вернуть значение из графического интерфейса. Вот список изменений, которые нужно сделать скопированными с этой страницы:

%%% OpenignFCN
uncomment uiwait

%%%OutputFCN
varargout{1} = handles.output;
% The figure can be deleted now
delete(handles.figure1);


%%%CloseReqFCN
if isequal(get(hObject, 'waitstatus'), 'waiting')
    % The GUI is still in UIWAIT, us UIRESUME
    uiresume(hObject);
else
    % The GUI is no longer waiting, just close it
    delete(hObject);
end
person Amro    schedule 07.08.2012
comment
Спасибо, @Amro, за внимание. Это было хорошее видео, но оно не ответило на мой вопрос. Как я уже сказал, я пытаюсь обновить переменную handles. В видео Дуг Халл научил, как удалить переменную графического интерфейса стажера, но я хочу удалить свою собственную переменную, вы поняли? Я имею в виду, что я хочу добавить переменную в структуру дескрипторов и убрать ее из своего графического интерфейса. - person jhonatanoliveira; 08.08.2012
comment
@jhow: извините за поздний ответ; идея та же, вы инициализируете свою собственную переменную в функции открытия (сохраняете ее внутри структуры handles), вы изменяете ее в функции обратного вызова кнопки, наконец, вы возвращаете ее значение в функции вывода (вызов uiwait вызывает выполнение блокировать до тех пор, пока фигура не будет удалена). Просто помните, что вам нужно вызывать GUIDATA каждый раз, когда вы изменяете структуру handles. - person Amro; 11.08.2012

В коде инициализации вы должны объявить это поле.

handles.test = [];

Так что вы можете позже назвать его.

person copiancestral    schedule 07.08.2012
comment
Спасибо за внимание, но это не сработало, @copiancestral :( - person jhonatanoliveira; 08.08.2012

Вам нужно добавить в

    handles = guidata(gcf);   

обновить дескрипторы в другой функции. Надеюсь, я прав.

person maohong    schedule 18.09.2014