0

这是一个基本问题,但我很难解决。

基本上,我有一个回调函数分配给 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 之类的东西,或者其他解决方法。但是,我并不完全理解这些文档。在这种情况下如何使用它们?

4

1 回答 1

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,您需要将弹出菜单的回调函数的“块”变量存储一些图的 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对象的标签属性,你可以根据它来查找它们的句柄,例如 usingh = findobj('Tag','my_tag')会给你带有标签'my_tag'的图形对象的句柄,然后你可以为 via 设置appdata setappdata(h, 'var_name', var);。我建议使用它而不是根图句柄,因为根图没有封装。

话虽如此,那么在您的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
于 2013-02-28T20:22:26.537 回答