【问题标题】:Most efficient way to call multiple GUIs in matlab在matlab中调用多个GUI的最有效方法
【发布时间】:2017-01-17 21:37:46
【问题描述】:

我的愿望是让用户选择数据,对其执行大量操作,然后调用其他人编写的 GUI (GUI3) 并将 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) 我如何关闭图形的图形用户界面但让它调用其他功能和图形用户界面? 3) 有没有更有效的方法来组合这些 .m 文件,让数据传递更顺畅,让我搞砸的地方更少?

此外,现在它从 GUI2 的 btnReady_Callback 返回并出错: H 必须是图形或图形后代的句柄。

我花了很长时间试图弄清楚这个规则,以至于我完全糊涂了。

【问题讨论】:

    标签: matlab matlab-figure matlab-guide


    【解决方案1】:

    不完全确定您所说的“立即将值分配给工作区”是什么意思,但我假设您说的是不要等到函数完全返回。你可以使用assignin来做到这一点

    assignin('base', 'varB', varB)
    assignin('base', 'varC', varC)
    

    但通常不鼓励这样做,因为它可能会覆盖用户之前定义的变量。此外,等待 GUI 返回并没有真正的好处,因为uiwait 将阻止命令窗口中任何内容的执行,直到 GUI 关闭为止。

    关于关闭 GUI 窗口,由于您使用 uiwaituiresume 等待其他 GUI 关闭,因此您无法真正关闭前两个 GUI,但您可以轻松地设置它们的 @ 987654327@ proeprty 到 'off' 所以他们只是不再对用户可见。

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

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

    我认为您实际上需要的是一个非 GUI 函数来协调所有其他 GUI 的打开/关闭

    【讨论】:

    • 感谢您的洞察力。如果我取出 uiwait 和 uiresume,是否会破坏功能(在 GUI 2 中我显示图像,让用户绘制 ROIS,然后在按下按钮时进行更多计算)? GUI1 存在是因为当我开始项目时,我对 GUIS 的了解不够,只能构建 GUI2 以使用已经选择的文件启动。一个非 GUI 功能来协调其他 GUIS 的打开和关闭将是完美的。有没有可以推荐的帖子或教程来解释如何做到这一点?
    • 好的!我可以(1)使用assignin(这也有帮助:mathworks.com/matlabcentral/answers/7517-from-gui-to-workspace),因为我不关心覆盖用户的变量(2)我从 GUI1_OutputFcn 中删除了 vargouts,因此现在 GUI2 使用它可以在不指定输出变量名称的情况下调用它分配,我把 delete(get(hObject, 'parent'));调用 GUI2 后立即进入 GUI1,因此 GUI1 关闭。是的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多