2013-02-28 251 views
0

这是一个基本的问题,但我很难与它。MATLAB的uicontrol回调函数句柄输出

基本上,我有一个回调函数分配给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”定义为块集函数的输出,那么如何让START_Callback将其识别为输入?每次尝试时,它都会告诉我“block”是一个未定义的函数或变量。

有什么我需要做的'回调',@ blockset“的代码行,让它识别功能的输出?

编辑:一些粗略的互联网搜索表明,我可能不得不使用像setappdata/getappdata,或另一种解决方法的方法。但是,我并不完全理解这些文档。我如何在这种情况下使用它们?

回答

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属性中,这些属性对于这两个回调函数都是可见的,或者如果您想要是懒惰的,可以将其存储到根图中。 例如

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回调函数设置root人物的块变量。所以,你的按钮声明将成为

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