我正在制作一个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
答案 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有mainwindow
和button1
,而按钮3有mainwindow
,button1
和{{ 1}}。正如您现在已经注意到的那样,无论您在代码中的其他位置进行了哪些更改,此结果都将保持不变。
当我转向程序化GUI而不是使用GUIDE时,我注意到了一个有趣的怪癖。您通常不会注意到GUIDE GUI,因为所有初始化都在后台处理,用户不会倾向于修改句柄结构。使用程序化GUI,您需要了解定义回调的顺序(在构建句柄结构后定义它们)。
另一种方法是使用@ {YisasL表示的guidata
。然后,您不必担心将变量传递给回调。
答案 1 :(得分:0)
您可以使用guidata
在handles
变量中添加新句柄,但只要您想使用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)。