0

我编写了一个代码,它创建了一个带有 3 个按钮和一个文本框的图形。当我按下按钮时,程序抱怨我的回调函数。

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 未定义函数或变量 'face' 时出错。

评估 uicontrol 回调时使用 waitfor 时出错

当我按下按钮 B1 时发生此错误。我希望按钮启动 changestate 功能。有人可以向我解释为什么我会收到这个错误吗?

4

1 回答 1

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),这可能是空的。

原因如下,在此引用

当 MATLAB 计算函数句柄时,与创建函数句柄时相同的变量在范围内。(相比之下,指定为字符串的回调在基本工作区中进行评估。)这简化了在 GUI 中管理全局数据(例如对象句柄)的过程。

而当您使用字符串时:

将回调属性设置为字符串会导致 MATLAB在调用回调时计算基础工作区中的该字符串

正如你所使用uiwait的,执行在内部停止uiwait (line 82)(对于我的 matlab 版本),它有一个waitfor命令,给出以下错误:

Error using waitfor
Undefined function or variable 'face'.

如果您不使用 a uiwait,它将评估全局工作区中的字符串回调,错误如下所示:

>> Undefined function or variable 'face'.

Error while evaluating uicontrol Callback

这个讨论也可能会引起您的兴趣。

于 2013-09-17T02:58:54.157 回答