2017-01-17 21 views
0

私の望みは、ユーザーにデータを選択させ、たくさんのものを与え、次に他の人が書いたGUIを呼び出す(GUI3)、varA、varB、およびvarCを返すことです。ワークスペースmatlabで複数のGUIを呼び出す最も効率的な方法

今私は、データをロードするだけのボタンで、含まれている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のFigureを閉じますが、他の関数やGUISを呼び出すにはどうすればいいですか? 3)これらの.mファイルを組み合わせるより効率的な方法があるので、データがよりスムーズに渡され、何か混乱する場所が少なくなります。

また、GUI2のbtnReady_Callbackから戻ってエラーが返されます。 HはFigureまたはFigure子孫のハンドルでなければなりません。

私はずっとこのルールを理解しようとしてきましたが、私は完全に混乱しています。

答えて

0

「値をすぐにワークスペースに割り当てる」という意味は完全にはわかりませんが、関数が完全に戻るまで待たずにいるとします。あなたはこの

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

を行うためにassigninを使用することができます。しかし、それは、彼らが以前に定義されているユーザーの変数を上書きする可能性があるため、これは一般的に推奨されていません。また、uiwaitは、GUIが何とか閉じられるまで、コマンドウィンドウ内の何かの実行をブロックするので、GUIが戻るのを待つ以上、これに実質的な利点はありません。 GUIウィンドウを閉じるについて

、あなたは他のGUIがクローズされるのを待つためにuiwaituiresumeを使用しているので、あなたが本当に最初の二つのGUIを閉じることはできませんが、簡単に'off'に自分Visible proeprtyに設定されて何ができますか彼らは単にユーザーには見えません。一般的に

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

しかし、これは(特にGUIDEベースのGUIのために)少し複雑そうですので、あなたが私たちにあなたがやろうとしているものについて、もう少し情報を提供している場合、我々はより多くを提供することができるかもしれエレガントなソリューション。たとえば、なぜGUI1が必要なのかは明らかではありません。私はあなたが実際に必要が他のGUI

+0

の全ての開放/閉鎖を調整するために非GUI機能は何だと思い

は、洞察力をいただき、ありがとうございます。uiwaitとuiresumeを取り除くと、その機能が機能しなくなります(GUI 2では画像を表示し、ROISを描画させてからボタンを押すと計算が増えます)。 私はプロジェクトを開始したときに私はGUISについて十分に知りませんでした。すでに選択されたファイルで起動するGUI2しか作成できなかったので、GUI1が存在します。他のGUISの開閉を調整する非GUI機能が完璧です。これを行う方法を説明することができる投稿やチュートリアルはありますか? –

+0

OK!私はユーザーの変数を上書きすることは気にしないので、私はassignin(これも助けられました:https://www.mathworks.com/matlabcentral/answers/7517-from-gui-to-workspace)で(1) GUI1_OutputFcnからvargoutsを削除しました。出力変数名を指定せずに呼び出すことができるようになりました.GUI2ではassigninが使用され、delete(get(hObject、 'parent'))); GUI2を呼び出した直後にGUI1に入り、GUI1が終了する。はい! –

関連する問題