Magnus Rosell rosell@csc.kth.se 2D1212 NumProg för M1, VT2006 A Föreläsning 5: Grafiska användargränssnitt Innehåll: Kap 9,10 i PEng Grafiska objekt/komponenter Handtag (handles) Grafiska användargränssnitt Grafik och handtag All grafik i matlab är uppbyggd av komponenter. Med hjälp av variabler, som innehåller sk handtag (handle), håller man reda på dessa komponenter. Grafiska komponenter har en massa egenskaper man kan manipulera. >> x=0:pi/100:2*pi; >> y=sin(x); >> h=plot(x,y); h är ett handtag till kurvan >> set(h, LineWidth, 15); LineWidth är en egenskap hos... >> get(h, LineWidth )... komponenten som h håller koll på Med get(h) får man reda på alla egenskaper för komponenten som handtaget h håller reda på. Grafiska användargränssnitt GUI - Graphical User Interface Vanliga program körs från början till slut. GUI-program styrs istället av användarens musklickningar och andra händelser orsakade av användaren. Därför pratar man om händelsehantering och säger att programmen är händelsestyrda (event driven). Knappar, menyer med mera kallas för GUI-komponenter. Varje gång användaren klickar på en GUI-komponent anropas dess Callback-funktion. Hur gör man? Öppna genom att i File-menyn välja New och sedan GUI Gör layouten: Placera ut alla GUI-komponenter och justera deras egenskaper med Property Inspector (dubbelklicka på komponenten). Egenskaper är t ex String (texten på komponenten) och Tag (komponentens namn i programmet)
Spara, t ex under namnet tamagochi så får du två filer: tamagochi.fig, en fil som beskriver layouten (mat-format) tamagochi.m, en funktionsfil med färdiga Callback-funktioner för varje komponent du lagt upp i din layout Modifiera funktionerna i filen tamagochi.m Callback-funktioner Inuti komponentens Callback-funktion skriver du vad som ska hända när man klickar på den. Använd parametern handles för att få handtaget till en GUI-komponent. Texgerhandles.mata handtaget till komponenten med namnet mata Komponenternas egenskaper kan modifieras med set set(handles.mata, String, Mums );... och läsas av med get storlek = get(handles.mata, Position ); Alla komponenter går att ändra från varje Callback-funktion. Exempel på GUI-komponenter Text Field, Pushbutton, Radio Button, List Box Kapitel 10.4 i PEng tar upp fler komponenter. Celltabeller Om en egenskap kan bestå av flera värden är den troligen en celltabell. Listan i en List Box är en celltabell, exempel: celltabell{1} = första raden ; celltabell{2} = andra raden ; celltabell{3} = tredje raden ; set(handles.listbox1, String,celltabell); Meddelanden Meddelanden (t ex om fel) kan fås med en Dialog Box, se s 479 i PEng. Exempel: warndlg( Rabarber bör inte ätas rå., Rabarberfel, modal ); Sista parametern kan vara modal (kräver uppmärksamhet) eller non-modal Bibliotek med GUI När programmet startas kommer ett nytt fönster. Där finns fem GUI-komponenter Rubriken Bibliotek (en TextField) Listan med böcker (en ListBox) Knapparna Låna, Återlämna och Spara (alla Pushbutton)
function varargout = bibliotek(varargin) BIBLIOTEK M-file for bibliotek.fig BIBLIOTEK, by itself, creates a new BIBLIOTEK or raises the existing singleton*. H = BIBLIOTEK returns the handle to a new BIBLIOTEK or the handle to the existing singleton*. BIBLIOTEK( Property, Value,...) creates a new BIBLIOTEK using the given property value pairs. Unrecognized properties are passed via varargin to bibliotek_openingfcn. This calling syntax produces a warning when there is an existing singleton*. BIBLIOTEK( CALLBACK ) and BIBLIOTEK( CALLBACK,hObject,...) call the local function named CALLBACK in BIBLIOTEK.M with the given input arguments. *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 bibliotek Last Modified by GUIDE v2.5 17-Feb-2006 11:41:52 Begin initialization code - DO NOT EDIT gui_singleton = 1; gui_state = struct( gui_name, mfilename,... gui_singleton, gui_singleton,... gui_openingfcn, @bibliotek_openingfcn,... gui_outputfcn, @bibliotek_outputfcn,... gui_layoutfcn, [],... gui_callback, []); if nargin && ischar(varargin{1})
gui_state.gui_callback = str2func(varargin{1}); if nargout [varargout{1:nargout}] = gui_mainfcn(gui_state, varargin{:}); else gui_mainfcn(gui_state, varargin{:}); End initialization code - DO NOT EDIT --- Executes just before bibliotek is made visible. function bibliotek_openingfcn(hobject, eventdata, handles, varargin) This function has no output args, see OutputFcn. hobject handle to figure varargin unrecognized PropertyName/PropertyValue pairs from the command line (see VARARGIN) Choose default command line output for bibliotek handles.output = hobject; Update handles structure guidata(hobject, handles); Här har magnus lagt till 060217 lasinbocker( bocker.txt ); listboxkomponenten = handles.listbox1; set(listboxkomponenten, String,boklistaSomCelltabell()); knapp1 = handles.pushbutton1; set(knapp1, String, Låna ); knapp2 = handles.pushbutton2; set(knapp2, String, Återlämna ); knapp3 = handles.pushbutton3; set(knapp3, String, Spara ); UIWAIT makes bibliotek wait for user response (see UIRESUME) uiwait(handles.figure1); --- Outputs from this function are returned to the command line. function varargout = bibliotek_outputfcn(hobject, eventdata, handles) varargout cell array for returning output args (see VARARGOUT); hobject handle to figure
Get default command line output from handles structure varargout{1} = handles.output; --- Executes on selection change in listbox1. function listbox1_callback(hobject, eventdata, handles) hobject handle to listbox1 (see GCBO) Hints: contents = get(hobject, String ) returns listbox1 contents as cell array contents{get(hobject, Value )} returns selected item from listbox1 --- Executes during object creation, after setting all properties. function listbox1_createfcn(hobject, eventdata, handles) hobject handle to listbox1 (see GCBO) handles empty - handles not created until after all CreateFcns called Hint: listbox controls usually have a white background on Windows. See ISPC and COMPUTER. if ispc && isequal(get(hobject, BackgroundColor ), get(0, defaultuicontrolbackgroundcolor )) set(hobject, BackgroundColor, white ); --- Executes on button press in pushbutton1. function pushbutton1_callback(hobject, eventdata, handles) hobject handle to pushbutton1 (see GCBO) Här har magnus lagt till 060217 listboxkomponenten = handles.listbox1; boknr = get(listboxkomponenten, Value ); lana(boknr); set(listboxkomponenten, String,boklistaSomCelltabell()); --- Executes on button press in pushbutton2. function pushbutton2_callback(hobject, eventdata, handles) hobject handle to pushbutton2 (see GCBO) Här har magnus lagt till 060217 listboxkomponenten = handles.listbox1; boknr = get(listboxkomponenten, Value ); returnera(boknr); set(listboxkomponenten, String,boklistaSomCelltabell());
--- Executes on button press in pushbutton3. function pushbutton3_callback(hobject, eventdata, handles) hobject handle to pushbutton3 (see GCBO) Här har magnus lagt till 060217 sparabocker( bocker.txt ); Här har magnus lagt till 060217. Följande är funktioner som anropas från Callback-funktionerna function lasinbocker(filnamn) Läser in böckerna från fil infil = fopen(filnamn, r ); nr = 1; while ~feof(infil) boklista(nr).titel = fgetl(infil); boklista(nr).forfattare = fgetl(infil); boklista(nr).lanadav = fgetl(infil); fgetl(infil); nr = nr + 1; ; fclose(infil); function sparabocker(filnamn) Sparar den ändrade boklistan på fil utfil = fopen(filnamn, w ); for nr = 1:length(boklista) fprintf(utfil, s\n, boklista(nr).titel); fprintf(utfil, s\n, boklista(nr).forfattare); fprintf(utfil, s\n, boklista(nr).lanadav); fprintf(utfil, \n ); fclose(utfil); function lana(boknr) Hanterar utlåning av bok Ändrar boklista if strcmp(boklista(boknr).lanadav, ingen ) anvandare = inputdlg( Ge ditt användarnamn:, Vem är du? ); if length(anvandare)>0 boklista(boknr).lanadav = anvandare{1}; else warndlg( Boken är redan utlånad, Tyvärr, modal );
function returnera(boknr) Hanterar återlämning av bok Ändrar boklista questdlg( Du har återlämnat boken! Gillade du den? ); boklista(boknr).lanadav = ingen ; function celltabell = boklistasomcelltabell() Konverterar boklistan från struct till celltabell för visning i listboxen for nr = 1:length(boklista) if strcmp(boklista(nr).lanadav, ingen ) pre = ; else pre = ---UTLÅNAD ; celltabell{nr} = strcat(boklista(nr).titel, ---,... boklista(nr).forfattare,pre);