在matlab中调用多个GUI的最有效方法

时间:2017-01-17 21:37:46

标签: matlab matlab-figure matlab-guide

我的愿望是让用户选择数据,做一堆东西,然后调用别人写的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)如何关闭GUI的图形但是让它调用其他函数和GUIS? 3)是否有一些更有效的方法来组合这些.m文件,以便数据传递得更顺畅,并且我可以减少搞乱的地方?

此外,它现在从GUI2< btnReady_Callback返回并返回错误: H必须是数字或数字后代的句柄。

我花了这么长时间试图找出这个我完全糊涂的规则。

1 个答案:

答案 0 :(得分:0)

通过“立即将值分配给工作区”并不完全确定你的意思,但我假设你在谈论的是不等到函数完全返回。您可以使用assignin来执行此操作

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

但这通常是不鼓励的,因为它可能会覆盖他们之前定义的用户变量。此外,等待GUI返回没有任何实际好处,因为uiwait将阻止在命令窗口中执行任何操作,直到GUI无论如何都被关闭。

关于关闭GUI窗口,因为您使用uiwaituiresume等待其他GUI关闭,您无法真正关闭前两个GUI,但您可以轻松完成将Visible proeprty设置为'off',这样他们就不再对用户可见了。

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

总的来说,这看起来有点复杂(特别是对于基于GUIDE的GUI),所以如果你给我们提供一些关于你想要做什么的更多信息,我们或许能够提供更优雅的解决方案。例如,不清楚为什么GUI1是必要的。

我认为你实际需要的是一个非GUI功能来协调所有其他GUI的打开/关闭