MATLAB 2013a GUI保存句柄在复选框回调中失败

时间:2014-07-30 09:30:29

标签: matlab user-interface callback handles

我正在制作一个GUI,通过串行接口从测量板读取数据。它由8个通道组成,我希望能够在图形图中启用和禁用通道,但我的变量handle.channelsEnable的状态未被保存。

打开GUI时:handles.channelEnable = [0; 0; 1; 1; 0; 0; 0; 0]; 在运行GUI时,我想修改一个handle.channelEnable。在复选框的回调函数内部,它被更改,但不在函数外部。我使用guidata(hObject,handles)来保存所做的更改。为什么不对handle.channelEnable进行更改?

    % --- Executes on button press in checkbox2.
    function checkbox2_Callback(hObject, eventdata, handles)
    % hObject    handle to checkbox2 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)

    % Hint: get(hObject,'Value') returns toggle state of checkbox2
        handles.channelEnable(2) = get(hObject,'Value');
        guidata(hObject, handles);
    end

3 个答案:

答案 0 :(得分:1)

@ YisasL的回答是正确的,但我想稍微澄清一下。

当为回调函数提供输入变量时,调用回调时传递的变量是在定义回调时存在的变量 。您可以通过一个简单的示例来看到这一点:

function testcode
handles.mainwindow = figure();

handles.button1 = uicontrol( ...
    'Style','pushbutton', ...
    'Units','normalized', ...
    'Position',[0.05 0.05 .30 .90], ...
    'String','Button1', ...
    'Callback',{@button1,handles} ...
    );
handles.button2 = uicontrol( ...
    'Style','pushbutton', ...
    'Units','normalized', ...
    'Position',[0.35 0.05 .30 .90], ...
    'String','Button2', ...
    'Callback',{@button2,handles} ...
    );
handles.button3 = uicontrol( ...
    'Style','pushbutton', ...
    'Units','normalized', ...
    'Position',[0.65 0.05 .30 .90], ...
    'String','Button3', ...
    'Callback',{@button3,handles} ...
    );
end

function button1(~,~,handles)
fieldnames(handles)
end

function button2(~,~,handles)
fieldnames(handles)
end

function button3(~,~,handles)
fieldnames(handles)
end

按下每个按钮,查看fieldnames显示的输出。您会注意到按钮1只有mainwindow,按钮2有mainwindowbutton1,而按钮3有mainwindowbutton1和{{ 1}}。正如您现在已经注意到的那样,无论您在代码中的其他位置进行了哪些更改,此结果都将保持不变。

当我转向程序化GUI而不是使用GUIDE时,我注意到了一个有趣的怪癖。您通常不会注意到GUIDE GUI,因为所有初始化都在后台处理,用户不会倾向于修改句柄结构。使用程序化GUI,您需要了解定义回调的顺序(在构建句柄结构后定义它们)。

另一种方法是使用@ {YisasL表示的guidata。然后,您不必担心将变量传递给回调。

答案 1 :(得分:0)

您可以使用guidatahandles变量中添加新句柄,但只要您想使用handles,就必须致电guidata以获取它们。作为回调的输入变量的变量handles不会包含它。

答案 2 :(得分:0)

我不认为我完全理解你。

你的意思是我必须添加guidata(hObject)来获取句柄吗?所以代码看起来像这样:

% --- Executes on button press in checkbox2.
function checkbox2_Callback(hObject, eventdata, handles)
% hObject    handle to checkbox2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of checkbox2
    handles
    guidata(hObject);
    handles
    handles.channelEnable(2) = get(hObject,'Value');
    guidata(hObject, handles);
end

无论是否有任何不同。在这两种情况下,所有句柄都是已知的(也是channelEnable)。