2013-05-19 97 views
1

我想用MATLAB創建一個GUI程序,但我想使用多個GUI。例如我有主要的gui功能,我想從編輯文本框中獲取另一個gui的數據。在下面的例子中,我想把p變量返回給主gui。使用多個GUI,並從MATLAB中的另一個GUI函數獲取數據

主界面:

function varargout = FoProgram(varargin) 

    gui_Singleton = 0; 
    gui_State = struct('gui_Name',  mfilename, ... 
        'gui_Singleton', gui_Singleton, ... 
        'gui_OpeningFcn', @FoProgram_OpeningFcn, ... 
        'gui_OutputFcn', @FoProgram_OutputFcn, ... 
        'gui_LayoutFcn', [] , ... 
        'gui_Callback', []); 
    if nargin && ischar(varargin{1}) 
     gui_State.gui_Callback = str2func(varargin{1}); 
    end 

    if nargout 
     [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); 
    else 
     gui_mainfcn(gui_State, varargin{:}); 
    end 

function FoProgram_OpeningFcn(hObject, eventdata, handles, varargin) 

    handles.output = hObject; 

    guidata(hObject, handles); 

function varargout = FoProgram_OutputFcn(hObject, eventdata, handles) 
    varargout{1} = handles.output; 


function labor_2_Callback(hObject, eventdata, handles) 

function fel1_Callback(hObject, eventdata, handles) 
    cla reset; 
    clc; 
    clear all; 

    n = guzu() %Here I call the second Gui function with edit textbox 
    uiwait(gcf); 

    x=linspace(-3*pi,3*pi,1000); 
    y=sin(x); 
    plot(x,y,'k','LineWidth',4) 
    sz='ymcrgbkymcrgbkymcrgbkymcrgbk'; 
    hold on 
    title('Sin(x) Taylor sora') 
    %n = str2num(N); 
    f=zeros(size(x)); 
    for i=1:n 
     t=(-1)^(i-1)*x.^(2*i-1)/factorial(2*i-1); 
     f=f+t; 
     plot(x,f,sz(i),'LineWidth',2) 
     axis([-10 10 -10 10]) 
     pause(1.5) 
     hold on 
     n=n+1; 
    end 



function exit_Callback(hObject, eventdata, handles) 
    close 

第二GUI

function varargout = guzu(varargin) 

    gui_Singleton = 1; 
    gui_State = struct('gui_Name',  mfilename, ... 
         'gui_Singleton', gui_Singleton, ... 
         'gui_OpeningFcn', @guzu_OpeningFcn, ... 
         'gui_OutputFcn', @guzu_OutputFcn, ... 
         'gui_LayoutFcn', [] , ... 
         'gui_Callback', []); 
    if nargin && ischar(varargin{1}) 
     gui_State.gui_Callback = str2func(varargin{1}); 
    end 

    if nargout 
     [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); 
    else 
     gui_mainfcn(gui_State, varargin{:}); 
    end 

function guzu_OpeningFcn(hObject, eventdata, handles, varargin) 
    handles.output = hObject; 

    guidata(hObject, handles); 

function varargout = guzu_OutputFcn(hObject, eventdata, handles) 
    varargout{1} = handles.output; 

function edit1_Callback(hObject, eventdata, handles) 

    p = str2double(get(hObject,'String')) %I want to return this 'p' to the main gui 
    close 

function edit1_CreateFcn(hObject, eventdata, handles) 

    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 
     set(hObject,'BackgroundColor','white'); 
    end 

回答

0

這種簡單的用戶輸入的是容易使用inputdlg函數來完成,而不需要創建一個單獨的圖形用戶界面 - 這裏的一個例子

inputTitle = 'Input Required'; 
inputPrompt = 'Enter a value for ''p'':'; 
userInput = inputdlg(inputTitle, inputPrompt); 
if isempty(userInput) 
    % User cancelled 
    return; 
else 
    p = userInput{1}; % userInput is a cell array 
    % Do something with p 
end 

這可能是你提供的例子是ve您的第二個UI的最終目標的最小版本,因此這可能不合適(但請注意,inputdlg函數能夠執行一些更復雜的行爲 - 請參閱the documentation)。如果您希望繼續使用單獨的用戶界面,那麼你必須做一些修改

%%% Add this line to the end of OpeningFcn 
uiwait; 


%%% Modify OutputFcn to have the following code: 
varargout{1} = str2double(get(handles.edit1, 'String')); 
% The figure can be deleted now 
% NOTE: You have to change this to the name of your figure, 
%  if it's not called figure1 
delete(handles.figure1); 


%%% Add the CloseRequestFcn callback and put this code in it 
if isequal(get(hObject, 'waitstatus'), 'waiting') 
    % The GUI is still in UIWAIT, us UIRESUME 
    uiresume(hObject); 
else 
    % The GUI is no longer waiting, just close it 
    delete(hObject); 
end 

最上面的是直接從here複製。您也可以從FoProgram中刪除對uiwait的呼叫。