我的愿望是让用户选择数据,做一堆东西,然后调用别人写的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必须是数字或数字后代的句柄。
我花了这么长时间试图找出这个我完全糊涂的规则。
答案 0 :(得分:0)
通过“立即将值分配给工作区”并不完全确定你的意思,但我假设你在谈论的是不等到函数完全返回。您可以使用assignin
来执行此操作
assignin('base', 'varB', varB)
assignin('base', 'varC', varC)
但这通常是不鼓励的,因为它可能会覆盖他们之前定义的用户变量。此外,等待GUI返回没有任何实际好处,因为uiwait
将阻止在命令窗口中执行任何操作,直到GUI无论如何都被关闭。
关于关闭GUI窗口,因为您使用uiwait
和uiresume
等待其他GUI关闭,您无法真正关闭前两个GUI,但您可以轻松完成将Visible
proeprty设置为'off'
,这样他们就不再对用户可见了。
set(handles.hfig, 'Visible', 'off')
[varA,varB,varC] = GUI2(handles);
总的来说,这看起来有点复杂(特别是对于基于GUIDE的GUI),所以如果你给我们提供一些关于你想要做什么的更多信息,我们或许能够提供更优雅的解决方案。例如,不清楚为什么GUI1
是必要的。
我认为你实际需要的是一个非GUI功能来协调所有其他GUI的打开/关闭