Matlab: GUI Interface

Erstellen eines GUI interfaces

(English) In diesem Beitrag zeige ich wie man mit Matlab ganz einfach ein GUI Interface mit Buttons etc. erstellt und ein Programm daraus schreibt.
Hierfür muss zuerst in Matlab in die Konsule "guide" eingegeben werden, dass sich ein Fester öffnet. Hier kann man jetzt entweder schon erstellt Interfaces öffnen oder ein neues erstellen.


In einem neu erstellten Interface kann ganz einfach mit den entsprechenden Buttons und anderen Objekten eine Oberfläche erstellt werden. Dies kann man speichern und ausführen woraufhin ein Matlab Code erstellt wird.
Für die Programmierung ist wichtig, dass hierbei jedem Objekt ein "Tag" zugeordnet wird und benannt wird. Dies kann man mit dem "Inspector" bearbeiten, indem einfach auf ein Objekt doppelt geklickt wird. Hier können auch noch weitere Einstellungen wie Design oder "Value" oder "Name" angegeben werden:
Hier kann nun mit dem grünen Pfeil des Editors der Code erstellt werden und die einzelnen Funktionen definiert werden.

Programmieren des GUI interfaces

Der Button kann nun programmiert werden, indem  in dem Quellcode unter "function pushbutton1_Callback(hObject, eventdata, handles)" der Code eingegeben wird. In meinem Fall zeichne ich eine Spirale in "axes1" in Abhängigkeit des Wertes des Textfeldes daneben (zwischen 0 und 3 Pi). Hierfür wird der Wert von "Slider" verwendet um die Reichweite von "x" zu anzugeben. Mit "global" kann man die Variable zu einer globalen Variable machen, wobei darauf zu achten ist, wenn sie in einem anderen Abschnitt benutzt wird muss immer erst "global x" hinu´zugefügt werden.

function pushbutton1_Callback(hObject, eventdata, handles)
global x;
xneu = 1080*get(handles.slider1,'Value')
x = [0:0.1:xneu/180*pi];


Für das Zeichnen wird erst die "axis" des Graph "axes1" ausgewählt:

axis(handles.axes1);

und dann geplottet:

plot(sin(x).*x,cos(x).*x,'parent',handles.axes1);
guidata(hObject,handles);

als nächstes wird der Wert der "Checkbox" eingelesen mit "get(handles...)"

check = get(handles.checkbox1,'Value');if check == 1
    axis(handles.axes2);
    plot(x,cos(x).*x,'parent',handles.axes2);
    guidata(hObject,handles);
end


Falls die Checkbox aktiviert ist, wird in "axes2" ebenfalls eine Funktion geplottet.
Für den "Slider" und die "Editbox" wird jeweils das "hObject", der Wert, mit "set" auf das andere übertragen, damit die beiden immer den gleichen Wert anzeigen.

function slider1_Callback(hObject, eventdata, handles)

slider = num2str( round(get(hObject,'Value')*1080,2) );
set(handles.edit1,'String', slider);


...

function edit1_Callback(hObject, eventdata, handles)

edit = round(str2num( get(hObject,'String') ),2);
set(handles.slider1,'Value',edit/(1080));


Hilfreich ist bei dem "Slider", der "Checkbox" und der "Editbox" jeweils wieder den Button aufzurufen, damit automatisch neu geplottet wird:

pushbutton1_Callback(hObject, eventdata, handles);

All die anderen Objekte der GUI Interface funktionieren änhlich und können immer mit der "Callback" Funktion editiert werden.

Quellcode:

function varargout = GUI(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @GUI_OpeningFcn, ...
                   'gui_OutputFcn',  @GUI_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 GUI_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;

guidata(hObject, handles);


function varargout = GUI_OutputFcn(hObject, eventdata, handles)

varargout{1} = handles.output;


% this is the buttom that shows the figures
function pushbutton1_Callback(hObject, eventdata, handles)
global x;
xneu = 1080*get(handles.slider1,'Value')
x = [0:0.1:xneu/180*pi];

axis(handles.axes1);
plot(sin(x).*x,cos(x).*x,'parent',handles.axes1);
guidata(hObject,handles);

check = get(handles.checkbox1,'Value');
if check == 1
    axis(handles.axes2);
    plot(x,cos(x).*x,'parent',handles.axes2);
    guidata(hObject,handles);
end

% this checkbox is plotting both figures if it is on
function checkbox1_Callback(hObject, eventdata, handles)
pushbutton1_Callback(hObject, eventdata, handles);

% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)

slider = num2str( round(get(hObject,'Value')*1080,2) );
set(handles.edit1,'String', slider);
pushbutton1_Callback(hObject, eventdata, handles);

function slider1_CreateFcn(hObject, eventdata, handles)

if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
end



function edit1_Callback(hObject, eventdata, handles)

edit = round(str2num( get(hObject,'String') ),2);
set(handles.slider1,'Value',edit/(1080));
pushbutton1_Callback(hObject, eventdata, handles);

function edit1_CreateFcn(hObject, eventdata, handles)

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



Kommentare

Beliebte Posts aus diesem Blog

Matlab: Fehlergeraden

Matlab: 3D Kartesisches Grid, Vektoren mit Transformation/Rotation

Matlab: 3D Plot in kartesischem Koordinatensystem