在定义回调函数和使用句柄方面,我遇到了一些问题。
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
答案 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
希望有所帮助!