这是一个基本问题,但我很难接受它。
基本上,我在GUI的弹出菜单中为选项分配了一个回调函数。代码如下:
uicontrol(mainfigure, 'Style', 'popup',...
'String', 'A|B|C',...
'Position',[850 190 200 30],...
'Callback', @blockset);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [block] = blockset(hObj,evnt) %#ok<INUSD>
blockval = get(hObj,'Value');
if blockval == 1
block = 'A';
elseif blockval == 2
block = 'B';
elseif blockval == 3
block = 'C';
end
end
如您所见,它只是为弹出菜单中的不同选项指定字符串值。我希望稍后在脚本中将这些字符串用作另一个函数的输入值(它也嵌入在uicontrol回调中):
uicontrol(mainscreen, 'Style', 'pushbutton',...
'Position',[855 300 150 50],...
'String', 'START',...
'FontSize',10,'FontWeight','bold',...
'BackgroundColor', [.9 .9 .9],...
'CallBack', {@START_Callback, block});
代码不起作用。但我无法弄清楚如何定义uicontrol回调的输出。我已经将“block”定义为blockset函数的输出,那么如何让START_Callback将其识别为输入?每次我尝试时,它只是告诉我“块”是一个未定义的函数或变量。
我是否需要使用“'Callback',@ blockset”代码行来识别函数的输出?
编辑:一些粗略的互联网搜索表明我可能必须使用setappdata / getappdata或其他解决方法。但是,我并不完全理解那些文档。在这种情况下如何使用它们?答案 0 :(得分:2)
当您执行
时,变量块必须存在于工作空间中uicontrol(mainscreen, 'Style', 'pushbutton',...
'Position',[855 300 150 50],...
'String', 'START',...
'FontSize',10,'FontWeight','bold',...
'BackgroundColor', [.9 .9 .9],...
'CallBack', {@START_Callback, block});
但它是弹出菜单回调的返回值,所以你不能这样做,因此你的matlab错误。
要使用setappdata和getappdata,你需要存储弹出菜单的回调函数的'block'变量某些数字的appdata属性,这些属性对于两个回调函数都是可见的,或者如果你想要懒惰,则需要根数字。 e.g。
function [block] = blockset(hObj,evnt) %#ok<INUSD>
blockval = get(hObj,'Value');
if blockval == 1
block = 'A';
elseif blockval == 2
block = 'B';
elseif blockval == 3
block = 'C';
end
setappdata(0, 'block', block);
end
这将把块变量存储到根图(即主MATLAB窗口,用0表示),这实际上不是一件好事,因为任何东西都可以改变它。相反,您应该尝试将其存储到一些句柄图形对象中,这些对象将对两个回调都可见,例如您的GUI图形。但是,我的问题中没有足够的信息可以推断出你可以使用的内容,因此我将根图用于说明目的。
如果设置GUI对象的标记属性,则可以根据该属性查找其句柄,例如:使用h = findobj('Tag','my_tag')
将使用标记“my_tag”为您提供图形对象的句柄,然后您可以通过setappdata(h, 'var_name', var);
设置appdata。我建议使用它而不是根图句柄,因为根图没有封装。
然后在你的START_Callback
函数中,不是将block
作为输入参数,而是使用block = getappdata(0, 'block');
来获取你设置的根图块变量你的blockset
回调函数。所以你的按钮声明将成为
uicontrol(mainscreen, 'Style', 'pushbutton',...
'Position',[855 300 150 50],...
'String', 'START',...
'FontSize',10,'FontWeight','bold',...
'BackgroundColor', [.9 .9 .9],...
'CallBack', @START_Callback);
并在START_Callback:
内function START_Callback(hObj,evnt)
block = getappdata(0, 'block');
%... other stuff
end