MATLAB:如何使用 findobj 函数在 2 个 GUI 之间传递数据?
MATLAB: How to pass data between 2 GUIs using the findobj-Function?
我是使用 Matlab 创建 GUI 的新手。我有一个 MainGui,我从中打开一个 Subgui,以便用户可以单击复选框。单击确定按钮后,我的 Subgui 关闭并且再次看到 MainGui-surface。
如何在不使用 getappdata 和 setappdata 的情况下访问 clickbutton 值 而 而不是使用 findobj-function 来访问它,当它工作时是对我来说容易多了。
所以我在 MainGui 代码中,我用
寻找 Subgui
hGui = findobj('Tag','Subgui');
其中 'Subgui' 是 SubGUI 的 Tag 属性 的值。 处理可见性 两者都启用!!
% get control handles for this GUI
handlesSubgui = guidata(hGui);
% now read the data from the checkbox
checkValue = get(handlesSubgui.checkbox1,'Value');
为什么不起作用?我设置了正确的标签并打开了处理可见性,但我得到
hGui =
Empty matrix: 0-by-1
!?
有人有想法吗?我很乐意得到帮助!
最好的问候,约翰
对于这种情况,要考虑的一个选项是在按钮回调中初始化一个小型 GUI。为了说明,我将设置一个小的程序化 GUI:
function testcode
res = get(0,'ScreenSize');
figdim = [300 300]; % Figure size, pixels
h.mainfig = figure( ...
'Units', 'Pixels', ...
'Position', [(res(3) - figdim(1))/2 (res(4) - figdim(2))/2 figdim(1) figdim(2)], ...
'Name', 'This is the Main GUI', ...
'Resize', 'off', ...
'DockControls', 'off', ...
'NumberTitle', 'off', ...
'MenuBar', 'none', ...
'Toolbar', 'none' ...
);
h.subGUIbutton = uicontrol( ...
'Parent', h.mainfig, ...
'Units', 'Normalized', ...
'Position', [0.25 0.6 0.5 0.3], ...
'String', 'Open Checkbox GUI' ...
);
h.displaydatabutton = uicontrol( ...
'Parent', h.mainfig, ...
'Units', 'Normalized', ...
'Position', [0.25 0.1 0.5 0.3], ...
'String', 'Display Checkbox Selections' ...
);
% Requires R2014b or newer, otherwise we'll have to use set
try
h.subGUIbutton.Callback = {@checkboxGUI, h};
h.displaydatabutton.Callback = {@displaydata, h};
catch
set(h.subGUIbutton, 'Callback', {@checkboxGUI, h});
set(h.displaydatabutton, 'Callback', {@displaydata, h});
end
我们的回调结构如下:
function checkboxGUI(~, ~, handles)
res = get(0,'ScreenSize');
figdim = [200 200]; % Figure size, pixels
h2.mainfig = figure( ...
'Units', 'Pixels', ...
'Position', [(res(3) - figdim(1))/2 (res(4) - figdim(2))/2 figdim(1) figdim(2)], ...
'Name', 'This is the Sub GUI', ...
'Resize', 'off', ...
'DockControls', 'off', ...
'NumberTitle', 'off', ...
'MenuBar', 'none', ...
'Toolbar', 'none' ...
);
% Build some checkboxes
for ii = 1:4
h2.checkbox(ii) = uicontrol( ...
'Parent', h2.mainfig, ...
'Style', 'checkbox', ...
'Units', 'Normalized', ...
'Position', [0.25 (1 - ii*0.15) 0.5 0.1], ...
'String', sprintf('Checkbox #%u', ii) ...
);
end
h2.closebutton = uicontrol( ...
'Parent', h2.mainfig, ...
'Style', 'pushbutton', ...
'Units', 'Normalized', ...
'Position', [0.25 0.15 0.5 0.1], ...
'String', 'Accept Changes', ...
'Callback', {@closecheckbox} ...
);
function closecheckbox(~, ~)
% requires R2014b or newer for dot notation
try
test = find([h2.checkbox(:).Value]); % Returns ID of checked boxes
catch
test = find(cell2mat(get(h2.checkbox(:), 'Value'))'); % Returns ID of checked boxes
setappdata(handles.mainfig, 'BoxesChecked', test);
close(h2.mainfig);
end
waitfor(h2.mainfig); % Wait for user to close the checkbox GUI
end
function displaydata(~, ~, handles)
BoxesChecked = getappdata(handles.mainfig, 'BoxesChecked');
if isempty(BoxesChecked)
fprintf('No boxes celected\n');
else
fprintf('User selected box: %d\n', BoxesChecked);
end
end
请注意,为了便于阅读,我使用了 nested function。在这个简单的示例中,我们的主 GUI 中有两个按钮,一个是打开用户提示的按钮,另一个是显示按钮。当用户打开复选框提示时,所有 GUI 命令的执行都会暂停,直到提示关闭。单击显示按钮时,我们从应用程序数据中获取选中的值并将它们打印到命令 window.
我是使用 Matlab 创建 GUI 的新手。我有一个 MainGui,我从中打开一个 Subgui,以便用户可以单击复选框。单击确定按钮后,我的 Subgui 关闭并且再次看到 MainGui-surface。
如何在不使用 getappdata 和 setappdata 的情况下访问 clickbutton 值 而 而不是使用 findobj-function 来访问它,当它工作时是对我来说容易多了。
所以我在 MainGui 代码中,我用
寻找 Subgui hGui = findobj('Tag','Subgui');
其中 'Subgui' 是 SubGUI 的 Tag 属性 的值。 处理可见性 两者都启用!!
% get control handles for this GUI
handlesSubgui = guidata(hGui);
% now read the data from the checkbox
checkValue = get(handlesSubgui.checkbox1,'Value');
为什么不起作用?我设置了正确的标签并打开了处理可见性,但我得到
hGui =
Empty matrix: 0-by-1
!?
有人有想法吗?我很乐意得到帮助! 最好的问候,约翰
对于这种情况,要考虑的一个选项是在按钮回调中初始化一个小型 GUI。为了说明,我将设置一个小的程序化 GUI:
function testcode
res = get(0,'ScreenSize');
figdim = [300 300]; % Figure size, pixels
h.mainfig = figure( ...
'Units', 'Pixels', ...
'Position', [(res(3) - figdim(1))/2 (res(4) - figdim(2))/2 figdim(1) figdim(2)], ...
'Name', 'This is the Main GUI', ...
'Resize', 'off', ...
'DockControls', 'off', ...
'NumberTitle', 'off', ...
'MenuBar', 'none', ...
'Toolbar', 'none' ...
);
h.subGUIbutton = uicontrol( ...
'Parent', h.mainfig, ...
'Units', 'Normalized', ...
'Position', [0.25 0.6 0.5 0.3], ...
'String', 'Open Checkbox GUI' ...
);
h.displaydatabutton = uicontrol( ...
'Parent', h.mainfig, ...
'Units', 'Normalized', ...
'Position', [0.25 0.1 0.5 0.3], ...
'String', 'Display Checkbox Selections' ...
);
% Requires R2014b or newer, otherwise we'll have to use set
try
h.subGUIbutton.Callback = {@checkboxGUI, h};
h.displaydatabutton.Callback = {@displaydata, h};
catch
set(h.subGUIbutton, 'Callback', {@checkboxGUI, h});
set(h.displaydatabutton, 'Callback', {@displaydata, h});
end
我们的回调结构如下:
function checkboxGUI(~, ~, handles)
res = get(0,'ScreenSize');
figdim = [200 200]; % Figure size, pixels
h2.mainfig = figure( ...
'Units', 'Pixels', ...
'Position', [(res(3) - figdim(1))/2 (res(4) - figdim(2))/2 figdim(1) figdim(2)], ...
'Name', 'This is the Sub GUI', ...
'Resize', 'off', ...
'DockControls', 'off', ...
'NumberTitle', 'off', ...
'MenuBar', 'none', ...
'Toolbar', 'none' ...
);
% Build some checkboxes
for ii = 1:4
h2.checkbox(ii) = uicontrol( ...
'Parent', h2.mainfig, ...
'Style', 'checkbox', ...
'Units', 'Normalized', ...
'Position', [0.25 (1 - ii*0.15) 0.5 0.1], ...
'String', sprintf('Checkbox #%u', ii) ...
);
end
h2.closebutton = uicontrol( ...
'Parent', h2.mainfig, ...
'Style', 'pushbutton', ...
'Units', 'Normalized', ...
'Position', [0.25 0.15 0.5 0.1], ...
'String', 'Accept Changes', ...
'Callback', {@closecheckbox} ...
);
function closecheckbox(~, ~)
% requires R2014b or newer for dot notation
try
test = find([h2.checkbox(:).Value]); % Returns ID of checked boxes
catch
test = find(cell2mat(get(h2.checkbox(:), 'Value'))'); % Returns ID of checked boxes
setappdata(handles.mainfig, 'BoxesChecked', test);
close(h2.mainfig);
end
waitfor(h2.mainfig); % Wait for user to close the checkbox GUI
end
function displaydata(~, ~, handles)
BoxesChecked = getappdata(handles.mainfig, 'BoxesChecked');
if isempty(BoxesChecked)
fprintf('No boxes celected\n');
else
fprintf('User selected box: %d\n', BoxesChecked);
end
end
请注意,为了便于阅读,我使用了 nested function。在这个简单的示例中,我们的主 GUI 中有两个按钮,一个是打开用户提示的按钮,另一个是显示按钮。当用户打开复选框提示时,所有 GUI 命令的执行都会暂停,直到提示关闭。单击显示按钮时,我们从应用程序数据中获取选中的值并将它们打印到命令 window.