在matlab中调用多个GUI的最有效方法
Most efficient way to call multiple GUIs in matlab
我的愿望是拥有一个用户 select 数据,对其进行一系列操作,然后调用其他人编写的 GUI (GUI3) 和 return varA、varB 和 varC到工作区。
现在我有 GUI1,它只是一个加载数据的按钮,包含:
function varargout = GUI1_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.varA;
varargout{2} = handles.varB;
varargout{3} = handles.varC;
uiresume
close
function pushbutton1_Callback(hObject, eventdata, handles)
[filename, pathname] = uigetfile({'*.7';'*.m';'*.mat';'*.*'}, 'Select a .pfile');
pfilepath=fullfile(pathname,filename);
[handles.tempD,handles.tempE,handles.tempF] = functionF(pfilepath);
guidata(hObject, handles);
[varA,varB,varC]=GUI2(handles);
handles.varA=varA;
handles.varB=varB;
handles.varC=varC;
guidata(hObject,handles) ;
uiresume
GUI2 完成大部分工作:
function GUI2_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
handles.tempD = varargin{1}.tempD;
handles.tempD = varargin{1}.tempE;
%%% does things with tempD and tempE and displays things...
guidata(hObject,handles)
uiwait
%%% other functions allow user to interact with data and create tempN
function varargout = GUI1_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.varA;
varargout{2} = handles.varB;
varargout{3} = handles.varC;
uiresume
function btnReady_Callback(hObject, ~, handles)
handles = guidata(hObject);
%%% does a bunch of stuff that eventually creates varA
[varB,varC]=GUI3(handles.tempD,handles.tempE,handles.tempN)
guidata(hObject, handles);
uiresume
GUI3 在内部做了很多事情然后显示了一些数据。
现在所有 GUI 都保持打开状态,直到 GUI3 关闭,此时它们都关闭并且变量进入工作区。理想情况下,我希望在计算变量后立即将变量获取到工作区,并让用户在需要时让 GUI2 和 GUI3 保持打开状态。我还希望 GUI1 在按下按钮后立即关闭,但仍然让其他一切 运行.
所以我的问题是:
1) 如何在 GUI 关闭之前立即将 varargout 带到工作区?
2) 如何为 GUI 关闭图形,但让它调用其他函数和 GUIS?
3) 是否有一些更有效的方法来组合这些 .m 文件,以便数据更顺畅地传递,并且让我搞砸的地方更少?
此外,现在 returns 和来自 GUI2 的错误 btnReady_Callback:
H 必须是图窗或图窗后代的句柄。
我花了很长时间试图弄清楚其中的规则,以至于我完全弄糊涂了。
不完全确定您所说的 "assign the values immediately to the workspace" 是什么意思,但我假设您是在谈论不要等到函数完全 returns。您可以使用assignin
来做到这一点
assignin('base', 'varB', varB)
assignin('base', 'varC', varC)
但这通常是不鼓励的,因为它可能会覆盖用户之前定义的变量。此外,等待 GUI return 并没有真正的好处,因为 uiwait
将阻止执行命令 window 中的任何内容,直到 GUI 无论如何关闭。
关于关闭GUI windows,由于您正在使用uiwait
和uiresume
等待其他GUI关闭,您无法真正关闭前两个GUI,但是您可以轻松地将它们的 Visible
属性设置为 'off'
,这样它们就不再对用户可见了。
set(handles.hfig, 'Visible', 'off')
[varA,varB,varC] = GUI2(handles);
不过,总的来说,这似乎有点复杂(尤其是对于 GUIDE-based GUI)所以如果您向我们提供更多关于您正在尝试做什么的信息,我们也许能够提供更多优雅的解决方案。例如,根本不清楚为什么 GUI1
是必需的。
我认为您实际上需要的是一个non-GUI函数来协调所有其他GUIopening/closing
我的愿望是拥有一个用户 select 数据,对其进行一系列操作,然后调用其他人编写的 GUI (GUI3) 和 return varA、varB 和 varC到工作区。
现在我有 GUI1,它只是一个加载数据的按钮,包含:
function varargout = GUI1_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.varA;
varargout{2} = handles.varB;
varargout{3} = handles.varC;
uiresume
close
function pushbutton1_Callback(hObject, eventdata, handles)
[filename, pathname] = uigetfile({'*.7';'*.m';'*.mat';'*.*'}, 'Select a .pfile');
pfilepath=fullfile(pathname,filename);
[handles.tempD,handles.tempE,handles.tempF] = functionF(pfilepath);
guidata(hObject, handles);
[varA,varB,varC]=GUI2(handles);
handles.varA=varA;
handles.varB=varB;
handles.varC=varC;
guidata(hObject,handles) ;
uiresume
GUI2 完成大部分工作:
function GUI2_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
handles.tempD = varargin{1}.tempD;
handles.tempD = varargin{1}.tempE;
%%% does things with tempD and tempE and displays things...
guidata(hObject,handles)
uiwait
%%% other functions allow user to interact with data and create tempN
function varargout = GUI1_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.varA;
varargout{2} = handles.varB;
varargout{3} = handles.varC;
uiresume
function btnReady_Callback(hObject, ~, handles)
handles = guidata(hObject);
%%% does a bunch of stuff that eventually creates varA
[varB,varC]=GUI3(handles.tempD,handles.tempE,handles.tempN)
guidata(hObject, handles);
uiresume
GUI3 在内部做了很多事情然后显示了一些数据。
现在所有 GUI 都保持打开状态,直到 GUI3 关闭,此时它们都关闭并且变量进入工作区。理想情况下,我希望在计算变量后立即将变量获取到工作区,并让用户在需要时让 GUI2 和 GUI3 保持打开状态。我还希望 GUI1 在按下按钮后立即关闭,但仍然让其他一切 运行.
所以我的问题是: 1) 如何在 GUI 关闭之前立即将 varargout 带到工作区? 2) 如何为 GUI 关闭图形,但让它调用其他函数和 GUIS? 3) 是否有一些更有效的方法来组合这些 .m 文件,以便数据更顺畅地传递,并且让我搞砸的地方更少?
此外,现在 returns 和来自 GUI2 的错误 btnReady_Callback: H 必须是图窗或图窗后代的句柄。
我花了很长时间试图弄清楚其中的规则,以至于我完全弄糊涂了。
不完全确定您所说的 "assign the values immediately to the workspace" 是什么意思,但我假设您是在谈论不要等到函数完全 returns。您可以使用assignin
来做到这一点
assignin('base', 'varB', varB)
assignin('base', 'varC', varC)
但这通常是不鼓励的,因为它可能会覆盖用户之前定义的变量。此外,等待 GUI return 并没有真正的好处,因为 uiwait
将阻止执行命令 window 中的任何内容,直到 GUI 无论如何关闭。
关于关闭GUI windows,由于您正在使用uiwait
和uiresume
等待其他GUI关闭,您无法真正关闭前两个GUI,但是您可以轻松地将它们的 Visible
属性设置为 'off'
,这样它们就不再对用户可见了。
set(handles.hfig, 'Visible', 'off')
[varA,varB,varC] = GUI2(handles);
不过,总的来说,这似乎有点复杂(尤其是对于 GUIDE-based GUI)所以如果您向我们提供更多关于您正在尝试做什么的信息,我们也许能够提供更多优雅的解决方案。例如,根本不清楚为什么 GUI1
是必需的。
我认为您实际上需要的是一个non-GUI函数来协调所有其他GUIopening/closing