在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,由于您正在使用uiwaituiresume等待其他GUI关闭,您无法真正关闭前两个GUI,但是您可以轻松地将它们的 Visible 属性设置为 'off',这样它们就不再对用户可见了。

set(handles.hfig, 'Visible', 'off')
[varA,varB,varC] = GUI2(handles);

不过,总的来说,这似乎有点复杂(尤其是对于 GUIDE-based GUI)所以如果您向我们提供更多关于您正在尝试做什么的信息,我们也许能够提供更多优雅的解决方案。例如,根本不清楚为什么 GUI1 是必需的。

我认为您实际上需要的是一个non-GUI函数来协调所有其他GUIopening/closing