我编写了一个代码,用于创建一个带有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'。
使用waitfor时出错 评估uicontrol回调时出错
按下按钮B1时发生此错误。我希望按钮启动changestate功能。谁能向我解释为什么我会收到这个错误?
答案 0 :(得分: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:
当MATLAB评估函数句柄时,会出现相同的变量 创建函数句柄时的范围。 (相比之下,回调 指定为字符串在基础工作区中进行评估。)这 简化了管理全局数据的过程,例如对象 处理,在GUI中。
而当你使用字符串:
将回调属性设置为字符串会导致MATLAB 对其进行评估 基础工作区中的字符串 调用回调时。
当您使用uiwait
时,执行会在uiwait (line 82)
(对于我的matlab版本)内停止,该命令具有waitfor
命令,会出现以下错误:
Error using waitfor
Undefined function or variable 'face'.
如果你不使用uiwait
,它将评估全局工作区的字符串回调,错误如下:
>> Undefined function or variable 'face'.
Error while evaluating uicontrol Callback
This discussion也可能符合您的利益。