Verfasst am: 21.04.2011, 22:39
Titel: Variablen aus Main Gui in Sub Gui übertragen
Hey,
diese Tuto befasst sich damit, wie man 2 GUIs interaktiv "verlinken" kann. Es gibt eine GUI1 (Maingui) und eine GUI2 (Subgui). Soll heißen, dass die Subgui nur aus der Maingui gestartet werden kann. Der Datentransfer geschieht in beide Richtungen. Natürlich ist dies nur ein kleines Beispiel, welches man noch beliebig erweitern kann.
Das Wichtigste ist, dass sowohl der Maingui wie auch der Subgui die jeweiligen figurehandle bekannt sein müssen. In diesem Fall besitzt die Mauingui den Tag GUI1 und die Subgui den Tag GUI2. Weil in den Handlestrukturen der jeweiligen figures die Tags als Feld gespeichert sind (von allen garfischen Objekten) ist dies wichtig zu Wissen.
Faustregeln:
1. Beim Aufruf der Subgui (GUI2) aus der Maingui (GUI1) das Handle der Maingui übergeben und als Rückgabewert das Handle der Subgui zurückverlangen. Diese dann mittels guidata in die Handlestrukturenle der jeweiligen andern mittels guidata speichern.
2. Jeder Callback enthält die Handlestruktur (handles). Somit ist in jedem Callbackworkspace (jede Funktion hat ihren eigen WS mit Ausnahme von nested Funktionen, die auch auf den WS der unterliegenden Funktion zugreifen können aber nicht andersherum) alles bekannt was man braucht. In diesem Fall kann man sich die Handlestruktur des jeweiligen figures mit guidata(handles.GUI1) bzw. guidata(handles.GUI2) laden.
3. Es ist natürlich wichtig immer abzufragen, ob die jeweilige andere figure offen ist, weil es sonst zu Fehlermeldungen kommt. Und das Geräusch der Fehlermeldung geht einem ja auf Dauer auch auf den Keks (nur nebenbei: man kann dieses auch ausschalten...). Für die Abfrage sind ishandle und isfield sehr nützlich.
4. guidata (zum Abspeichern) muss nur benutzt werden, wenn sich das Handlestruct ändert. Soll heißen, wenn
Code:
handles.NeueVariable = 'Peterchen';
% oder
handles.x = handles.x+1;
erweitert oder geändert wurde. Alle grafischen oder selbstgeschriebenen Handles (z.B. String vom Textobjekt ändern) müssen nicht mittels guidata geupdatet werden, weil es Instanzen aus Handleklassen sind und nicht aus Valueklassen (nachzulesen in der Matlabhilfe).
So nun ein paar Zeilen zum Nachvollziehen (Anbei sind noch die m & fig Files). Wegen des Wiederkennungswertes (oder falls Matlab gerade nicht installiert ist) habe ich die GUIDE- Kommentare und den Quellcode im Folgenden gepostet.
GUI1
Code:
functionvarargout = GUI1(varargin) % GUI1 MATLAB code for GUI1.fig % GUI1, by itself, creates a new GUI1 or raises the existing % singleton*.
%
% H = GUI1 returns the handle to a new GUI1 or the handle to % the existing singleton*.
%
% GUI1('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in GUI1.M with the given input arguments.
%
% GUI1('Property','Value',...) creates a new GUI1 or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before GUI1_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to GUI1_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help GUI1
% Last Modified by GUIDE v2.5 21-Apr-2011 21:41:38
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @GUI1_OpeningFcn, ...
'gui_OutputFcn', @GUI1_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
ifnargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
% --- Executes just before GUI1 is made visible. function GUI1_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to GUI1 (see VARARGIN)
% Choose default command line output for GUI1
handles.output = hObject;
% UIWAIT makes GUI1 wait for user response (see UIRESUME) % uiwait(handles.GUI1);
% --- Outputs from this function are returned to the command line. functionvarargout = GUI1_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure varargout{1} = handles.output;
function edit1_Callback(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit1 as text % str2double(get(hObject,'String')) returns contents of edit1 as a double
% --- Executes during object creation, after setting all properties. function edit1_CreateFcn(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. ifispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in pushbutton_neuer_text. function pushbutton_neuer_text_Callback(hObject, eventdata, handles) % hObject handle to pushbutton_neuer_text (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) if ~isfield(handles,'press') if ~isempty(get(handles.edit1,'String'))
handles.press = numel(get(handles.edit1,'String'))+1;
str = get(handles.edit1,'String');
str(end+1) = {sprintf('Pressed %0.0f',handles.press)};
set(handles.edit1,'String',str);
else
handles.press = 1;
set(handles.edit1,'String',{sprintf('Pressed %0.0f',handles.press)}) end else
str = get(handles.edit1,'String');
handles.press = handles.press + 1;
str(end+1) = {sprintf('Pressed %0.0f',handles.press)};
set(handles.edit1,'String',str);
end guidata(hObject,handles);
% --- Executes on button press in pushbutton_in_gui2_uebernehmen. function pushbutton_in_gui2_uebernehmen_Callback(hObject, eventdata, handles) % hObject handle to pushbutton_in_gui2_uebernehmen (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) ifisfield(handles,'GUI2')% check ob GUI2 in handles entahlten ist
hadnlesGUI2 = guidata(handles.GUI2);% handlesstruktur der Gui2 laden set(hadnlesGUI2.edit1,'String',get(handles.edit1,'String'))% Sring der editbox der Gui2 setzen figure(handles.GUI2)% bringt GUI2 zur front else msgbox('Bitte öffnen Sie erst GUI 2!','GUI 2 existiert nicht!','help','modal') end
% --- Executes on button press in pushbutton_open_gui2. function pushbutton_open_gui2_Callback(hObject, eventdata, handles) % hObject handle to pushbutton_open_gui2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) if ~isfield(handles,'GUI2')% check ob GUI2 in handles entahlten ist
handles.GUI2 = GUI2(handles.GUI1); % handlesstruktur der Gui1 laden guidata(handles.GUI1,handles)% speichern der handlestruktur (guidata(hObject,handles) würde auch gehen) else figure(handles.GUI2); % bringt GUI2 zur front end
% --- Executes when user attempts to close GUI1. function GUI1_CloseRequestFcn(hObject, eventdata, handles) % hObject handle to GUI1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) ifisfield(handles,'GUI2') delete(handles.GUI2) end % Hint: delete(hObject) closes the figure delete(hObject);
functionvarargout = GUI2(varargin) % GUI2 MATLAB code for GUI2.fig % GUI2, by itself, creates a new GUI2 or raises the existing % singleton*.
%
% H = GUI2 returns the handle to a new GUI2 or the handle to % the existing singleton*.
%
% GUI2('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in GUI2.M with the given input arguments.
%
% GUI2('Property','Value',...) creates a new GUI2 or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before GUI2_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to GUI2_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help GUI2
% Last Modified by GUIDE v2.5 21-Apr-2011 21:13:52
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @GUI2_OpeningFcn, ...
'gui_OutputFcn', @GUI2_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
ifnargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
% --- Executes just before GUI2 is made visible. function GUI2_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to GUI2 (see VARARGIN) try
handles.GUI1 = varargin{1}; % handle des figures GUI1 in handlestruktur der GUI2
% Choose default command line output for GUI2
handles.output = hObject;
% Update handles structure guidata(hObject, handles);
catch %#ok
uiwait(msgbox('Bitte erst GUI1 starten!','GUI1 Starten','error','modal')) delete(hObject) end
% UIWAIT makes GUI2 wait for user response (see UIRESUME) % uiwait(handles.GUI2);
% --- Outputs from this function are returned to the command line. functionvarargout = GUI2_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure try varargout{1} = handles.output;
catch %#ok
end
function edit1_Callback(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit1 as text % str2double(get(hObject,'String')) returns contents of edit1 as a double
% --- Executes during object creation, after setting all properties. function edit1_CreateFcn(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. ifispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in pushbutton_neuer_text. function pushbutton_neuer_text_Callback(hObject, eventdata, handles) % hObject handle to pushbutton_neuer_text (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) if ~isfield(handles,'press') if ~isempty(get(handles.edit1,'String'))
handles.press = numel(get(handles.edit1,'String'))+1;
str = get(handles.edit1,'String');
str(end+1) = {sprintf('Pressed %0.0f',handles.press)};
set(handles.edit1,'String',str);
else
handles.press = 1;
set(handles.edit1,'String',{sprintf('Pressed %0.0f',handles.press)}) end else
str = get(handles.edit1,'String');
handles.press = handles.press + 1;
str(end+1) = {sprintf('Pressed %0.0f',handles.press)};
set(handles.edit1,'String',str);
end guidata(hObject,handles);
% --- Executes on button press in pushbutton_in_GUI1_uebernehmen. function pushbutton_in_GUI1_uebernehmen_Callback(hObject, eventdata, handles) % hObject handle to pushbutton_in_GUI1_uebernehmen (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) ifishandle(handles.GUI1)% abfrage ob GUI1 noch offen ist (also valid ist)
hadnlesGUI1 = guidata(handles.GUI1);% handlestruktur der GUI1 laden set(hadnlesGUI1.edit1,'String',get(handles.edit1,'String'))% setzen des editfeldes der GUI1 figure(handles.GUI1)% bringt GUI1 zur front else
uiwait(msgbox('GUI1 wurde geschlossen! GUI 2 wird auch geschlossen!','GUI 1 existiert nicht mehr!','help','modal')) delete(handles.GUI2) end
% --- Executes when user attempts to close GUI2. function GUI2_CloseRequestFcn(hObject, eventdata, handles) % hObject handle to GUI2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
handlesGUI1 = guidata(handles.GUI1); % laden der handlestruktur der GUI1
handlesGUI1 = rmfield(handlesGUI1,'GUI2');% feld löschen GUI2 aus handlestruktur GUI1 guidata(handlesGUI1.GUI1,handlesGUI1)% update handlestruktur GUI1
% Hint: delete(hObject) closes the figure delete(hObject);
Es gibt natürlich auch noch andere Methoden soetwas zu Realisieren (setappdata/getappdata/rmappdata, Nested Funktionen (benötigt keine Handlestruktur aber wär sinniger selbst zu Programmieren, bzw. die Layout_fc vom GUIDE zu exportieren und dann alle Callbacks in Nested Funktionen zu packen), Userdata zu benutzen).
Auch Javaobjekte sind leicht zu integrieren, insofern die standard Matlab uicontrols etc nicht genügen. Hierfür ist z.B. eine Seite zu empfehlen -> http://undocumentedmatlab.com/ . Ich glaube damit schließe ich jetzt ersteinmal ab.
schön erklärt und schönes Beispiel, auch wenn ich es leider noch nicht bei mir hinbekommen habe, aber ist es mit den beiden Programmen, wenn ich Sie mit Hilfe des deploxment-tool weitergeben will. wird das GUI2 bei der Anwedung mit dem deploymenttool automatisch mitgenommen?
auch wenn ich es leider noch nicht bei mir hinbekommen habe
was genau macht dir denn Probleme?
Mit dem Deploytool sollte es kein Problem sein. Einfach Gui1.m als Mainfunktion hinzufügen, den Rest sollte er von selber finden. Achte bitte darauf, dass auch beide fig- Files hinzugefügt werden (das siehst du während des Kompelierens). Alle Files sollten natürlich im Current Path liegen...
Mein Beispiel von oben ist ein GUIDE Beispiel. Auf der folgenden Seite gibt es eine sehr umfangreiche Beschreibung von GUI- Programmierung in Matlab und einen kurzen Ausflug zu Javaobjekten in Matlab.
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.