【问题标题】:MATLAB uicontrol callback function handle outputMATLAB uicontrol 回调函数句柄输出
【发布时间】:2013-02-28 16:10:20
【问题描述】:

这是一个基本问题,但我很难回答。

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

我需要对“'Callback', @blockset”行代码做些什么来让它识别函数的输出吗?

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

【问题讨论】:

    标签: function matlab output


    【解决方案1】:

    当你这样做时,变量块必须存在于工作区中

    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,您需要将弹出菜单的回调函数的“块”变量存储一些图窗的 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 = getappdata(0, 'block'); 来获取您在blockset 回调函数中设置的根图形的块变量,而不是将block 作为输入参数.所以你的按钮声明会变成

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 2019-03-14
      • 1970-01-01
      相关资源
      最近更新 更多