2017-01-17 6 views
0

Мое желание состоит в том, чтобы пользователь выбирал данные, делал кучу вещей, а затем вызывал GUI, который кто-то написал (GUI3), и возвращал varA, varB и varC для рабочее пространство.Самый эффективный способ вызова нескольких графических интерфейсов в matlab

Сейчас у меня есть 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 делает кучу вещей внутри и затем отображает некоторые данные.

Прямо сейчас все графические интерфейсы остаются открытыми до тех пор, пока GUI3 не будет закрыт, после чего все они будут закрыты, а переменные перейдут в рабочее пространство. В идеале я хотел бы получить переменные в рабочей области, как только они будут рассчитаны, и позволить пользователю оставить GUI2 и GUI3 открытыми, если они захотят. Мне также хотелось бы, чтобы GUI1 закрывался, как только нажималась кнопка, но все же позволяла запускать все остальные.

Итак, мои вопросы: 1) Как мне получить varargout в рабочее пространство прямо перед закрытием GUI? 2) Как закрыть фигуру для графического интерфейса, но оставить ее для вызова других функций и GUIS? 3) Есть ли еще более эффективный способ комбинирования этих файлов .m, чтобы данные передавались более плавно, и мне меньше места, чтобы что-то испортить?

Кроме того, прямо сейчас оно возвращается и ошибка из файла btnReady_Callback от GUI2: H должен быть дескриптором фигуры или потомка фигуры.

Я так долго пытался понять правила этого, что я полностью смущен.

ответ

0

Не совсем уверен, что вы подразумеваете под «присваиванием значений немедленно рабочей области», но я предполагаю, что вы говорите о том, что не дожидаетесь, пока функция полностью вернется. Вы могли использовать assignin сделать это

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

Но это, как правило, не рекомендуется, так как она может перезаписать пользовательские переменные, которые они ранее определены. Также нет никакой реальной выгоды для этого, ожидая возвращения GUI, поскольку uiwait собирается заблокировать выполнение чего-либо в командном окне до тех пор, пока графический интерфейс не будет закрыт.

О закрытии GUI окна, так как вы используете uiwait и uiresume ждать другие ГПИ быть закрыты, вы не можете закрыть первые два ГПИ, но то, что вы можете легко сделать, это установить их Visible proeprty к 'off' поэтому они просто просто не видны пользователю.

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

В целом, хотя, это кажется немного сложнее (особенно для GUIDE на основе ГПИ), так что если вы дать нам немного больше информации о том, что вы пытаетесь сделать, мы можем быть в состоянии обеспечить более элегантное решение. Например, непонятно, почему необходимо GUI1.

Я думаю, что вы на самом деле потребность является функцией не-GUI для координации открытия/закрытия всех остальных ГПИ

+0

Благодарим Вас за понимание.Если я выберу uiwait и uiresume, это нарушит функциональность (в GUI 2 я покажу изображения, позвольте пользователю нарисовать ROIS, а затем сделать больше вычислений при нажатии кнопки)? GUI1 существует, потому что, когда я начал проект, я не знал достаточно о GUIS и мог строить GUI2 только с уже выбранными файлами. Функция, отличная от GUI для координации открытия и закрытия других GUIS, была бы идеальной. Есть ли сообщение или учебник, которые вы могли бы порекомендовать, чтобы объяснить, как это сделать? –

+0

OK! Я мог бы сделать (1) с assignin (это также помогло: https://www.mathworks.com/matlabcentral/answers/7517-from-gui-to-workspace), поскольку я не забочусь о переписывании пользовательских переменных (2) Я удалил vargouts из GUI1_OutputFcn, чтобы его можно было вызывать без указания имен выходных переменных теперь, когда GUI2 использует assignin, и я помещаю delete (get (hObject, 'parent')); в GUI1 сразу после вызова GUI2, поэтому GUI1 закрывается. Да! –