正确使用 button/checkbox 回调
Properly using button/checkbox callback
我在定义回调函数和使用句柄时遇到了一些问题。
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
这里有几个选择。请注意,回调默认需要 2 个输入参数,因此您的问题很可能来自于此。我找不到我曾经看过的关于此的参考资料,但您可能想尝试其中之一:
1) 在回调中,手动检索存储在 handles 结构中的数据。
创建按钮时,添加 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)
这里"handles to figure"是当前图形的句柄。每次修改 handles 结构中的某些内容时,您都希望更新与图形关联的数据。在这里,我将再次让您了解这一点。
然后让你的回调函数看起来像这样:
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 个默认参数(你不使用,所以你可以用 ~
替换它们)。其实你可以使用第一个参数,但那是另一回事了。老实说,我不知道为什么在这种特定情况下你必须这样做......
无论如何使用以下方法都可以:
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
希望对您有所帮助!
我在定义回调函数和使用句柄时遇到了一些问题。
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
这里有几个选择。请注意,回调默认需要 2 个输入参数,因此您的问题很可能来自于此。我找不到我曾经看过的关于此的参考资料,但您可能想尝试其中之一:
1) 在回调中,手动检索存储在 handles 结构中的数据。
创建按钮时,添加 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)
这里"handles to figure"是当前图形的句柄。每次修改 handles 结构中的某些内容时,您都希望更新与图形关联的数据。在这里,我将再次让您了解这一点。
然后让你的回调函数看起来像这样:
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 个默认参数(你不使用,所以你可以用 ~
替换它们)。其实你可以使用第一个参数,但那是另一回事了。老实说,我不知道为什么在这种特定情况下你必须这样做......
无论如何使用以下方法都可以:
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
希望对您有所帮助!