正确使用按钮/复选框回调

时间:2015-06-16 17:05:30

标签: matlab matlab-guide

在定义回调函数和使用句柄方面,我遇到了一些问题。

 h1 = uicontrol('style','pushbutton','units','pixels',...
                 'position',[40,5,70,20],'string','test',...
                'callback',@h1_call);

我使用上面的代码创建了一个按钮,如果按下此按钮,我想绘制存储在句柄中的一些信息。

function h1_call(handles)
axes(handles.ax1)
plot(handles.x,handles.y);
遗憾的是,这不起作用,我不知道为什么。 (也尝试使用{@ p_call,handles}预定义输入,但这也无济于事。)

感谢您的帮助!

EDIT1:我收到以下错误:

Error using GUIname>h1_call
Too many input arguments.

Error while evaluating UIControl Callback

EDIT2:对于大多数情况,提到的解决方案工作正常。但是,如果我创建一个复选框并在复选框回调中想要查看其值是1还是0,我仍然会收到错误:

handles.CB_1 = uicontrol('style','checkbox','units','pixels',...
                'position',[40,12,200,30],'string','try1','fontsize',16,...
                'callback',{@CB_1_Callback,handles});
guidata(hObject,handles);

_

function CB_1_Callback(a1,a2,handles)   
if get(handles.CB_1,'Value')==1
disp('Value=1');
elseif get(handles.CB_1,'Value')==0
disp('Value=0');
end

错误:

Reference to non-existent field 'CB_1'.

Error in GUIname>CB_1_Callback (line 569)
if get(handles.CB_1,'Value')==1

Error while evaluating UIControl Callback

1 个答案:

答案 0 :(得分:2)

这里有几种选择。请注意,回调默认情况下需要2个输入参数,因此您的问题很可能来自于此。我找不到我曾经看过的关于这个的参考,但你可能想尝试其中一个:

1)在回调中,手动检索存储在句柄结构中的数据。

创建按钮时,即使不使用它们,也要添加2个输入参数:

h1 = uicontrol('style','pushbutton','units','pixels',...
                 'position',[40,5,70,20],'string','test',...
                'callback',@(s,e) h1_call);

现在在创建uicontrol之后的某个地方,您想要更新GUI的guidata,即使用此命令:

guidata("handles to figure", handles)

这里“handle to figure”是当前图形的句柄。每次修改句柄结构中的某些内容时,您都希望更新与该图相关联的数据。在这里,我再次让你读到这个。

然后让你的回调函数看起来像这样:

function h1_call(handles)
handles = guidata("handles to figure")
axes(handles.ax1)
plot(handles.x,handles.y);

2)在创建按钮时将handles作为参数添加到回调中,如您提到的那样,在{}中包含,但这次在回调中提供了3个输入参数

因此按钮代码如下所示:

h1 = uicontrol('style','pushbutton','units','pixels',...
                     'position',[40,5,70,20],'string','test',...
                    'callback',{@h1_call,handles});

和回调:

function h1_call(DumyA,DummyB,handles)

    axes(handles.ax1)
    plot(handles.x,handles.y);

前2个参数未使用且具有特殊功能,我将让您在文档中查看它们。

修改

至于你的问题(编辑2),在这种情况下你只需要为回调提供2个默认参数(你不使用它,所以你可以用~替换它们)。实际上你可以使用第一个参数,但这是另一个故事。说实话,我不知道为什么在这种特殊情况下你必须这样做......

无论如何使用以下工作正常:

function testfig
clear
clc

hFig = figure;
handles.CB1 = uicontrol('style','checkbox','units','pixels',...
    'position',[40,12,200,30],'string','try1','fontsize',16,...
    'callback',{@CB_1_Callback});

guidata(hFig,handles);

%// Don't consider the arguments. 
    function CB_1_Callback(~,~)

        if get(handles.CB1,'Value')==1
            disp('Value=1');
        elseif get(handles.CB1,'Value')==0
            disp('Value=0');
        end
    end

end

希望有所帮助!