MATLAB uicontrol回调函数句柄输出

时间:2013-02-28 16:10:21

标签: function matlab output

这是一个基本问题,但我很难接受它。

基本上,我在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或其他解决方法。但是,我并不完全理解那些文档。在这种情况下如何使用它们?

1 个答案:

答案 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