处理Matlab GUI中的行为

时间:2014-08-02 18:18:03

标签: matlab

为什么这不起作用?正如您在下面的错误报告中所看到的,字段handles.check不会被带到回调函数。

function example2_4

N=500;
M=300;

handles.fig=figure('Units','Pixels',...
    'Position',[100 100 N M])

handles.axes=axes('Units','Pixels',...
    'Position',[25 25 N-200 M-50]);

handles.check=uicontrol('style','checkbox',...
    'string','Enable Axes Grid Lines',...
    'Position',[N-150,M/2-25 150 50],...
    'Callback',{@checkbox_callback,handles});

function checkbox_callback(gcf,event_data,handles)
handles
val=get(handles.check,'Value');
if val
    grid on;
else
    grid off;
end

错误报告:

handles = 

     fig: 2
    axes: 331.0076

Reference to non-existent field 'check'.

Error in example2_4>checkbox_callback (line 19)
val=get(handles.check,'Value');

Error while evaluating uicontrol Callback

然而,这个确实有效。这次handle.check被带到回调函数。

function example2_4

N=500;
M=300;

handles.fig=figure('Units','Pixels',...
    'Position',[100 100 N M]);

handles.axes=axes('Units','Pixels',...
    'Position',[25 25 N-200 M-50]);

handles.check=uicontrol('style','checkbox',...
    'string','Enable Axes Grid Lines',...
    'Position',[N-150,M/2-25 150 50]);

set(handles.check,'Callback',{@checkbox_callback,handles});


function checkbox_callback(gcf,event_data,handles)
handles
val=get(handles.check,'Value');
if val
    grid on;
else
    grid off;
end

处理报告:

handles = 

      fig: 3
     axes: 488.0044
    check: 489.0044

1 个答案:

答案 0 :(得分:1)

只有handles的副本被传递到回调中。所以在

handles.check=uicontrol('style','checkbox',...
   'string','Enable Axes Grid Lines',...
   'Position',[N-150,M/2-25 150 50],...
   'Callback',{@checkbox_callback,handles});

handles,作为checkbox_callback的参数传递,只设置axesfig字段,因为代码仅在创建过程中check字段。

而在

set(handles.check,'Callback',{@checkbox_callback,handles});

handles(或其副本)已根据之前的三个陈述设置了figaxescheck字段。

修改

我总是使用GUIDE创建我的GUI,然后依靠guidata函数来获取和设置handles结构中的字段。在您的示例中,您可能需要使用guidata或使用setappdatagetappdata函数执行类似的操作。有关详细信息,请参阅Share Data Amongst Callbacks