2013-09-17 2 views
0

Я написал код, который создает фигуру с 3 кнопками и текстовым полем. программа жалуется на мою функцию обратного вызова, когда я нажимаю кнопку.MATLAB: У меня проблемы с функцией обратного вызова

function game(states) 

fig=figure('position',[200 150 500 370]); 
face.B1=uicontrol('parent',fig,'style','pushbutton','string','start!','visible','on','position',[20 160 460 50]); 
face.B2=uicontrol('style','pushbutton','parent',fig,'string','B2','visible','off','position',[20 90 460 50]); 
face.B3=uicontrol('style','pushbutton','parent',fig,'string','B3','visible','off','position',[20 20 460 50]); 
face.txtbx=uicontrol('style','text','parent',fig,'string','welcome to my game. press start to begin','position',[20 230 460 120]); 

%set the callback function of the button 
%when the button is pressed, i want to initiate the changestate function 

set(face.B1,'callback','changestate(face,states,1);'); 

% while 1 
    uiwait(fig) 
% end 

end 

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

function face = changestate(face,states,nextstate) 

disp('enter changestate') 
    face.B1=set(face.B1,'string',states{nextstate}.B1str,'callback','changestate(face,states,states{nextstate}.B1next)'); 

if ~isnan(states(nextstate).B2str) 
    face.B2=set(face.B2,'string',states{nextstate}.B2str,'callback','changestate(face,states,states{nextstate}.B2next)','visible','on'); 
else face.B2=set(face.B2,'visible','off'); 
end 

if ~isnan(states(nextstate).B3str) 
    face.B3=set(face.B3,'string',states{nextstate}.B3str,'callback','changestate(face,states,states{nextstate}.B3next)','visible','on'); 
else face.B3=set(face.B3,'visible','off'); 
end 

face.txtbx=set(face.txtbx,'string',states{nextstate}.txtbxstr); 
%  uiresume(fig) 
end 

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

ошибок с помощью WaitFor Undefined функции или переменной «лица».

Ошибка использования WaitFor Ошибка при оценке UIControl CallBack

Эта ошибка возникает, когда я нажимаю кнопку B1. Я хочу, чтобы кнопка инициировала функцию изменения. может кто-нибудь объяснить мне, почему я получаю эту ошибку?

+0

спасибо werner. мой код теперь работает –

+0

Добро пожаловать. Пожалуйста, примите ответ, щелкнув зеленую проверку возле моего ответа. Не забывайте, что если вы хотите уведомить человека, который отвечает на ваш вопрос, вам нужно прокомментировать его ответ, иначе человек не будет знать, что вы прокомментировали. Я также заметил, что вы не принимали ответ на свои другие вопросы, пожалуйста, если вы удовлетворены ответами, обязательно отметьте их как принятые. Икс) – Werner

ответ

1

Когда вы используете объявление строки для обратного вызова, оно будет оцениваться в области обратного вызова рабочей области. Если вы хотите, чтобы ваша функция, которая будет оценена с переменными в текущей области видимости, вы должны использовать одно из следующих действий:

…,'callback',@(~,~) changestate(face,states,states{nextstate}.B1next),... 
…,'callback',@(hObj,evt) changestate(hObj,evt,face,states,states{nextstate}.B1next),... 
…,'callback',{@changestate,face,states,states{nextstate}.B1next),... 

вместо:

...,'callback','changestate(face,states,states{nextstate}.B1next),... 

Где во втором и третьем обратных вызовов, вашей функции должен иметь возможность извлекать еще два аргумента, которые являются дескриптором кнопки (hObj) и данными события (evt), которые, вероятно, будут пустыми.

Причина заключается в следующем, quoting here:

When MATLAB evaluates function handles, the same variables are in scope as when the function handle was created. (In contrast, callbacks specified as strings are evaluated in the base workspace.) This simplifies the process of managing global data, such as object handles, in a GUI.

В то время, когда вы используете строку:

Setting a callback property to a string causes MATLAB to evaluate that string in the base workspace when the callback is invoked.

Как вы использовали uiwait, выполнение останавливается внутри uiwait (line 82) (для моей MATLAB версии), которая имеет a waitfor, что вызывает ошибку:

Error using waitfor 
Undefined function or variable 'face'. 

Если вы не используете uiwait, он будет оценивать строку обратного вызова в глобальном рабочем пространстве, и ошибка будет выглядеть так:

>> Undefined function or variable 'face'. 

Error while evaluating uicontrol Callback 

This discussion также может быть ваш интерес.

Смежные вопросы