2017-01-17 1 views
0

Mein Wunsch ist es, einen Benutzer Daten auswählen zu lassen, eine Menge Dinge zu tun, dann eine GUI zu rufen jemand anderes schrieb (GUI3) und varA, varB und varC zurückgeben der Arbeitsbereich.Der effizienteste Weg, mehrere GUIs in Matlab aufzurufen

Im Moment habe ich GUI1, die nur eine Taste ist, Daten zu laden und enthält:

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 tut die meiste Arbeit:

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 

Und GUI3 hat ein paar Sachen intern und zeigt dann einige der Daten an.

Im Moment bleiben alle GUIs offen, bis GUI3 geschlossen ist. An diesem Punkt werden alle geschlossen und die Variablen gehen in den Arbeitsbereich. Im Idealfall möchte ich die Variablen sofort nach der Berechnung in den Arbeitsbereich bringen und den Benutzer dazu veranlassen, GUI2 und GUI3 offen zu lassen, wenn sie möchten. Ich möchte auch, dass die GUI1 schließt, sobald die Taste gedrückt wird, aber alles andere noch laufen lässt.

Also meine Fragen: 1) Wie bekomme ich varargout sofort in den Arbeitsbereich, bevor die GUI geschlossen ist? 2) Wie schließe ich eine Figur für eine GUI, aber lasse sie andere Funktionen und GUIS aufrufen? 3) Gibt es eine effizientere Möglichkeit, diese .m-Dateien zu kombinieren, so dass die Daten reibungsloser übertragen werden und es weniger Möglichkeiten gibt, etwas zu vermasseln?

Auch jetzt gibt es zurück und Fehler von GUI2 btnReady_Callback: H muss der Handle zu einer Figur oder Figur nachkommen.

Ich habe so lange versucht, die Regeln zu verstehen, dass ich gründlich verwirrt bin.

Antwort

0

Es ist nicht ganz sicher, was Sie meinen, indem Sie "die Werte sofort dem Arbeitsbereich zuweisen", aber ich gehe davon aus, dass Sie nicht warten, bis die Funktion vollständig zurückkehrt. Sie könnteassignin verwenden diese

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

zu tun, aber dies in der Regel abgeraten, da sie Variablen des Benutzers überschreiben können, die sie vorher definiert haben. Außerdem gibt es keinen wirklichen Vorteil gegenüber dem Warten auf die Rückkehr der GUI, da uiwait die Ausführung von irgendetwas in dem Befehlsfenster blockieren wird, bis die GUI irgendwie geschlossen wird.

Über GUI-Fenster zu schließen, da Sie verwenden uiwait und uiresume zu warten, die anderen GUIs geschlossen werden, kann man nicht wirklich die ersten beiden GUIs schließen, aber was Sie leicht tun können, setzen ihre Visible proeprty zu 'off' Sie sind einfach nicht mehr für den Benutzer sichtbar. obwohl

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

Im Allgemeinen scheint dies ein wenig kompliziert (vor allem für GUIDE-basierte GUIs) so, wenn Sie uns ein wenig mehr Informationen darüber, was Sie versuchen zu tun, können wir eine mehr liefern können elegante Lösung. Zum Beispiel ist nicht klar, warum GUI1 überhaupt notwendig ist.

Ich denke, was Sie tatsächlich brauchen, ist eine nicht-GUI-Funktion das Öffnen/Schließen von allen anderen GUIs

+0

Vielen Dank für die Einsicht zu koordinieren.Wenn ich die uiwait und uiresume herausnehmen würde, würde das die Funktionalität zerstören (in GUI 2 zeige ich Bilder an, lasse den Benutzer ROIS zeichnen und mache dann mehr Berechnungen auf Knopfdruck)? GUI1 existiert, weil, als ich das Projekt startete ich nicht genug über GUIS wusste und konnte GUI2 nur zum Starten mit den bereits ausgewählten Dateien erstellen. Eine Nicht-GUI-Funktion zum Koordinieren des Öffnens und Schließens anderer GUIS wäre perfekt. Gibt es einen Post oder ein Tutorial, die du empfehlen kannst, um das zu erklären? –

+0

OK! Ich könnte tun (1) mit assignin (das half auch: https://www.mathworks.com/matlabcentral/answers/7517-from-gui-to-workspace), da ich keine Sorge über das Überschreiben von Benutzer Variablen (2) Ich entfernte die Vargouts von GUI1_OutputFcn, so dass es aufgerufen werden kann, ohne die Namen der Ausgabevariablen anzugeben, da GUI2 assignin verwendet, und ich delete (get (hObject, 'parent')); in GUI1 sofort nach dem Aufruf von GUI2, damit GUI1 schließt. Ja! –

Verwandte Themen