guier g˝r godt - dtu orbitorbit.dtu.dk/files/5443035/imm2500.pdf · imm, dtu niels gj˝l jacobsen....

26
GUIer Gør Godt Introduktion til GUIer i Matlab IMM, DTU Niels Gjøl Jacobsen

Upload: lyhuong

Post on 16-May-2019

217 views

Category:

Documents


0 download

TRANSCRIPT

GUIer Gør Godt

Introduktion til GUIer i Matlab

IMM, DTU

Niels Gjøl Jacobsen

Forord

GUI er en forkortelse for ’Graphical User Interface’, og det er en særdeles nyt-tig made at visualisere sine data, og det gør det ligeledes pa en simpel mademuligt at ændre enkelte parametrer i beregninger og se de fysiske, matematiskeeller andre ændringer, som sker i forbindelse med ændringen af disse parametrer.

Ydermere hjælper GUIer til, at der bliver skabt en grænse for, hvor megetbrugeren kan ændre i programmet, da der ikke direkte kontakt til den bagved-liggende kode.

Denne introduktion er skrevet til Matlab 6.5. R13.

DTU 2003

i

Indhold

1 Et lille eksempel 1

2 GUIDE 32.1 Elementerne i GUIDE . . . . . . . . . . . . . . . . . . . . . . . . 4

2.1.1 Push Button . . . . . . . . . . . . . . . . . . . . . . . . . 42.1.2 Toggle Button . . . . . . . . . . . . . . . . . . . . . . . . 42.1.3 Radio Buttons . . . . . . . . . . . . . . . . . . . . . . . . 42.1.4 Checkbox . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.1.5 Edit Text . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.1.6 Static Text . . . . . . . . . . . . . . . . . . . . . . . . . . 42.1.7 Slider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.1.8 Frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.1.9 Popup Menu . . . . . . . . . . . . . . . . . . . . . . . . . 52.1.10 Listbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.1.11 Axes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.2 Property Inspector . . . . . . . . . . . . . . . . . . . . . . . . . . 52.3 Layout af GUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.3.1 Størrelse, farve og andet . . . . . . . . . . . . . . . . . . . 62.3.2 Justering af elementer . . . . . . . . . . . . . . . . . . . . 62.3.3 Tabulator . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.4 Dannelse af .m-fil til programmering af GUI . . . . . . . . . . . . 7

3 Variabelstrukturen 83.1 Lokale variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83.2 Globale variable . . . . . . . . . . . . . . . . . . . . . . . . . . . 83.3 Handles-strukturen . . . . . . . . . . . . . . . . . . . . . . . . . . 8

3.3.1 Variable med handles-strukturen . . . . . . . . . . . . . . 93.4 Andre mader at dele data mellem de enkelte elementfunktioner . 10

4 Programmering af elementer 124.1 Push Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124.2 Toggle Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124.3 Radio Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134.4 Checkbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134.5 Interaktion mellem Edit Text og Slider . . . . . . . . . . . . . . . 144.6 Listbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154.7 Popup Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

ii

5 Lidt ekstra 175.1 Dataoverførsel mellem GUIer . . . . . . . . . . . . . . . . . . . . 175.2 Dialogbokse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

5.2.1 Indbyggende dialogbokse . . . . . . . . . . . . . . . . . . 185.3 Indsættelse af iconer . . . . . . . . . . . . . . . . . . . . . . . . . 195.4 Print af plot i en GUI . . . . . . . . . . . . . . . . . . . . . . . . 19

5.4.1 Flere Axes i en GUI . . . . . . . . . . . . . . . . . . . . . 20

6 Appendix 216.1 Sma tricks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216.2 Ting, som skal huskes . . . . . . . . . . . . . . . . . . . . . . . . 216.3 Kode til frembringelse af lup-icon . . . . . . . . . . . . . . . . . . 21

iii

Kapitel 1

Et lille eksempel

For at gennemga nogle af de overordnede begreber vil et eksempel pa en GUI,som alle har stiftet bekendskab med, blive gennemgaet her. Den GUI, det drejersig om, er en browse-funktion, som er særdeles nyttig, nar filer skal vælges iforbindelse med andre GUIer. Selve GUIen bestar af to filer, som henholdsvishar .fig og .m som extension. Den første af disse to filer dannes ved at benytteet program under Matlab, hvor det er muligt at placere de enkelte elementeri et figurfelt. Som det fremgar af figur 1.1 er der blevet brugt 4 forskellige ele-menter ud af 11 mulige til at lave denne browsefunktion. Alle elementerne vilblive gennemgaet samlet under kapitel 2. De benyttede elementer er Listbox,Static Text, Edit Text og Pushbutton.

I forbindelse med dannelsen af .fig-filen er det ligeledes muligt at definerede forskellige elementers udseende hvad angar farver, størrelse etc.

Figur 1.1: Udseende af browse-funktionen.

1

Tilbage er der .m-filen, som delvist bliver genereret af Matlab, nar .fig-filengemmes, men det eneste den indeholder er skabeloner til de funktioner, der her-efter vil blive kaldt callbacks, som er knyttet til de enkelte elementer. Underhver af disse callbacks er det herefter muligt at programmere, hvad det enkelteelement skal kunne. I forbindelse med programmeringen af disse er det minerfaring, at det er en fordel at benytte den sakaldte handles-struktur, se kapi-tel 3, som gør det let at føre data rundt mellem de enkelte callbacks / elementer.

Det mest interessante i denne forbindelse er dog nok muligheden for at kaldeandre GUIer fra en GUI. Dette sker i dette eksempel, nar der trykkes pa denPushbutton, som er behæftet med strengen Filter, som gør det muligt at filtrerepa specifikke extensions i browsefunktionen. Nar denne knap aktiveres abnes etvindue, som kan ses i figur 1.2. Som det fremgar er det de samme 4 elementer, der

Figur 1.2: Filterfunktionens opbygning med de samme elementer som i browse-funktionen.

er benyttet i forbindelse med filterfunktionen. Selve det at kalde en anden GUIfra en GUI er simpelt, da .m-filen er en funktion med underliggende callbacks,hvorfor det bare er at kalde denne funktion fra en anden GUI. Dataoverførselmellem de to GUI sker som sædvanligt med dataoverførsel mellem to funktioneri Matlab.

Det ovenstaende vil blive beskrevet i detaljer i de følgende afsnit.

2

Kapitel 2

GUIDE

Til opbygning af GUIer i Matlab er der to muligheder for at opbygge dengrafiske brugergrænseflade.

Der er muligheden for selv at skrive en .m-fil, som angiver placering, farve ogegenskaber ved de enkelte elementer. Denne fremgangsmade vil ikke blive be-skrevet i det efterfølgende. I stedet vil der blive beskrevet, hvordan den grafiskebrugergrænseflade kan blive opbygget ved at benytte GUIDE, hvor det er grafiskmuligt at angive lay-outet af GUIen og simpelt justere pa de enkelte parametre.

GUIDE kaldes ved at skrive guide i kommandolinien i Matlab, hvorved derabner et figurfelt magen til det, som kan ses i figur 2.1.

Figur 2.1: Sadan ser GUIDE ud nar det abnes. De vigtigste knapper samt hjæl-pelinier er fremhævet.

3

2.1 Elementerne i GUIDE

Det er muligt at benytte 11 grafiske elementer i opbygningen af en GUI, hvor derblev stiftet bekendtskab med de 4 af dem i kapitel 1. Disse 11 elementer vil kortblive beskrevet herunder, hvorefter kodningen af nogle af dem vil blive berørt ikapitel 4, nar den overordnede handtering af handles-strukturen er beskrevet.

2.1.1 Push Button

Push Buttons bruges, nar en handling skal bekræftes eller udføres, hvilket foreksempel kunne være kaldet til GUIen filter fil under kapitel 1.

2.1.2 Toggle Button

Toggle Buttons kan benyttes, safremt det ønskes at angive om en egenskab eraktiv eller inaktiv. Dette kan for eksempel være en zoom-knap knyttet til enAxes, i hvilken det er muligt at inkludere plots i en GUI.

For let at anskueliggøre egenskaben ved elementet kan der pasættes et iconsymboliserende elementets egenskab. Dette kan for eksempel være en lup. Denbagvedliggende kode, som danner en lup med farvet baggrund, kan ses i appen-dix 6.3, og metoden til at indsætte disse pa elementet kan ses beskrevet underafsnit 5.3.

2.1.3 Radio Buttons

Safremt der er flere options at vælge imellem er Radio Buttons en oplagt mulig-hed. De enkelte Radio Buttons kan forbindes, saledes at alle pa nær en nulstilles,nar en anden vælges til værende aktiv.

2.1.4 Checkbox

Hvis flere uafhængige options skal angives som værende aktive eller inaktive iforbindelse med kørsel af en GUI er det muligt at benytte Checkboxes til detteformal.

2.1.5 Edit Text

Til at inkludere helt valgfrie parametre eller udtryk i GUIen benyttes Edit Textelementet.

Et eksempel kan være, at i forbindelse med løsningen af en differentiallig-ning vil det være nødvendigt at have den nødvendige begyndelsesværdi sominputstørrelse.

2.1.6 Static Text

Dette element er et ikke-aktivt element, som kan benyttes til at indlægge for-klarende tekst i GUIen. En anden brug kunne være at ændre den tilknyttedetekststreng løbende alt efter hvilke parametre der er valgt.

4

Med et ikke-aktivt elementet menes, at der ikke genereres et callback til ele-mentet i den .m-fil, som Matlab genererer.

2.1.7 Slider

Ønskes der valgt en numerisk størrelse i en GUI, som ligger i et nærmere angi-vet interval, er det hensigtmæssigt at benytte en Slider i kombination med etEdit Text element. Pa denne made er det visuelt let at se for brugeren, hvadgrænserne for intervallet er. Samspillet med Edit Text elementet gør det let atindtaste specifikke numeriske størrelser, som det ikke er muligt at ramme præ-cist ved at bevæge Slideren. Men ligeledes giver Edit Text elementet mulighedfor at vise, hvilken aktuel værdi Slideren har, nar denne bevæges.

En implementering af denne egenskab er angivet i afsnit 4.5.

2.1.8 Frame

En Frame benyttes til at samle enkelte elementer og angive, at de hænger sam-men i en større enhed. For eksempel en række Radio Buttons imellem hvilke derskal / kan vælges et enkelt element.

2.1.9 Popup Menu

Hvis brugeren skal vælge imellem nogle forskellige indstillingsmuligheder erPopup Menuen et glimrende virkemiddel. Dette kunne være om en plottet kurveskal være rød, bla, gul eller grøn, hvorfor disse muligheder vil være givet somprædefinerede muligheder i Popup Menuen.

2.1.10 Listbox

Et Listbox-element er yderst anvendeligt, nar der skal indhentes lange lister,eller hvis brugeren skal vælge mellem en lang række prædefinerede indstillinger.Det skyldes, at det ikke vil være hensigtsmæssigt, at benytte en Popup Menutil for mange valgmuligheder.

2.1.11 Axes

Hvis det ønskes at plotte i GUIen, skal der indsættes en eller flere Axes, i hvilkedet er muligt at plotte beregnede data. Med Axes er det ligeledes ad omveje mu-ligt at printe til fil eller direkte til printer, men hvordan de korrekte Axes bliverbenyttet til plots og hvordan printet fortages, beskrives nærmere under kapitel 5.

Axes er som standard ikke et aktivt element, men udelukkende et element, somkan blive mal for en handling udført ved aktivering af et af de andre elementer.

2.2 Property Inspector

I GUIDE er det muligt at abne et vindue kaldet Property Inspector, i hvilket deter muligt at definere alle de variable størrelser, som er gældende for de enkelteelementer. Dette værende farve, størrelse, position, tilknyttet tekststreng, etc.

5

Pa figur 2.1 er det muligt at se, hvordan Property Inspector abnes

Den vigtigste variabel, som bør ændres inden .m-filen dannes første gang erelementets tag. Dette skyldes, at alle elementer far tildelt et tag med stan-dartnavne, som kan være svære at huske. Dette kan eksempelvis være edit1,edit2, ..., edit20, hvis der er 20 Edit Text elementer i brug. Derfor er detvigtigt at ændre disse navne til noget, der er lettere at huske og giver størremening i forbindelse med det elementet skal bruges til i GUIen.

Et eksempel pa et lettere navn kunne for eksempel være at ændre en Pushbut-ton’s tag fra pushbutton3 til close, safremt elementets funktion er at lukkeGUIen. Dette gør det væsentligt lettere at huske de enkelte tags, som skal be-nyttes i programmeringsfasen.

Det er meget vigtigt at bemærke, at det er besværligt at ændre et elementstag efter dets callback er genereret, og endvidere skal koden tjekkes, for at derikke er referencer til netop dette callback, hvor det gamle tag benyttes. Sa detanbefales at holde fast i de enkelte tags, nar disse først er defineret og taget ibrug.

2.3 Layout af GUI

Der er to elementer, der er vigtige at tage højde for, nar lay-outet af GUIen skalfærdiggøres. For det første skal opsætningen være letforstaelig, sa det er simpeltat ga til. For det andet skal den grafiske side af lay-outet være indbydende,hvorfor en vis konsekvens i størrelserne af elementer, farve og placering af disseer meget vigtig.

Det er udelukkende den sidste del af lay-outet, der vil blive beskrevet herunder.

2.3.1 Størrelse, farve og andet

Størrelse, farve og andet ændres lige som alle andre parametre ved brug paProperty Inspector.

2.3.2 Justering af elementer

Justering af elementer kan foretages pa fire forskellige mader.

1. Under menuen Tools i GUIDE vælges Grid and Rulers. Her er det mu-ligt at sla Show rulers til. Dette give en lodret og vandret lineal i figur-feltet. Ud fra disse linealer kan der trækkes hjælpelinier, hvilket giver etbrugerdefineret net, hvorefter det er muligt at placere de enkelte elementerhurtigt og nemt, da elementerne ’snapper’ til disse hjælpelinier.

2. Nar GUIDE abnes, er der et prædefineret net af hjælpelinier, som liggerfast, som elementerne ligeledes ’snapper’ til.

3. Under menuen Tools er det ligeledes muligt at vælge Align Objects,hvorved elementer kan placeres i forhold til hinanden, pa den made det

6

er angivet i det figurfelt, der kommer op, nar denne menu kaldes. Menuenser ud som pa figur 2.2.

4. Endelig er det muligt at placere de enkelte elementer ved at indtaste deønskede koordinatsæt i Property Inspector.

Figur 2.2: Sadan ser vinduet Align Objects ud.

2.3.3 Tabulator

Da en del af layoutet ogsa omfatter en brugervenlig rækkefølge af objekterne,nar TAB benyttes til at springe imellem disse, er der under Tools en menu ihvilken det er muligt at ændre pa tabulatorrækkefølgen. Denne menu hedderTab Order Editor.

Som udgangspunkt er rækkefølge den, i hvilken elementerne er blevet indsati GUIDE, og denne er ikke altid den mest hensigtsmæssige, da enkelte elemen-ter kan have været glemt i begyndelsen.

2.4 Dannelse af .m-fil til programmering af GUI

Nar alle de nødvendige tags er defineret er det pa tide at danne den .m-fil, somskal benyttes til at definere de enkelte elementers egenskaber. Denne dannessimplest ved at vælge at gemme figuren dannet i GUIDE pa normal vis vedSave As....

Tilføjes der senere nye elementer til figuren i GUIDE er det intet problem. Fi-guren gemmes blot og et callback til elementet genereres af Matlab og tilføjesi bunden af .m-filen.

7

Kapitel 3

Variabelstrukturen

I forbindelse med datastrømmen i en GUI er det muligt at benytte sig af treformer for variable. Det er lokale og globale variable og endelig variable, sombliver styret af den sakaldte handles-struktur. De tre typer variable vil blivebehandlet herunder.

3.1 Lokale variable

De lokale variable eksisterer kun i den funktion, de er tilknyttet. Det betyder, atder er flere callbacks, som godt kan have en variabel med samme variabelnavn.

3.2 Globale variable

Globale variable har den ulempe, at de er tilgængelige overalt i Matlab. Detvil sige, at kørsel af andre funktioner i Matlab, der kører sideløbende medGUIen, ogsa har adgang til disse variable. Dette kan være uønsket, da der saikke er 100% styr pa variablerne. Globale variable kan ikke anbefales, da handles-strukturen giver større muligheder. Der kan fas mere information ved at skrivehelp global.

3.3 Handles-strukturen

Alle elementer har en handle, og det er dette GUIen bygger pa. Denne handleindeholder alle de data, som bliver defineret i forbindelse med Property In-spector, se afsnit 2.2, og den enkelte handle ligger gemt i et strukturfelt, somindeholder handles pa samtlige elementer.

Alle variable i dette strukturfelt har det samme fornavn, nemlig handles.*,hvor stjernen ikke skal opfattes som om, at alle filformater er tilladte, men atalle efterfølgende lovlige variablenavne er tilladte. For eksempel vil en Push But-ton automatisk fa tildelt handles.pushbutton1, nar den dannes i GUIDE.

Dette betyder, at de variable, som er tilknyttet elementer i GUIen, har sammeefternavn som deres tag.

8

Det kan i MatLab simpelt tjekkes om et variablenavn er tilladt ved at be-nytte kommadoen isvarname(’string’).

3.3.1 Variable med handles-strukturen

Ud over at der er tilknyttet et handle til samtlige callbacks / elementer, kander oprettes vilkarligt mange handles til at gemme data i. Fremgangsmade vilblive vist med et eksempel.

Det tænkes, at der i en Popup Menu dannes en række data, som sidenhenskal plottes, nar der trykkes pa en Push Button. Dette gøres pa følgende made,safremt data ønskes overført via handles-strukturen mellem de forskellige call-backs. Hvis dette ikke er tilfældet, se da afsnit 3.4.

% --- Executes on selection change in popup.function popup_Callback(hObject, eventdata, handles)% hObject handle to popup (see GCBO)% eventdata reserved - to be defined in a future version of

MATLAB% handles structure with handles and user data

(see GUIDATA)

% Hints: contents = get(hObject,’String’) returns popupcontents as cell array

% contents{get(hObject,’Value’)} returns selected itemfrom popup

x = linspace(0,1,100);x = x(:);handles.uddata = [x, sin(x)];guidata(hObject,handles);

% --- Executes on button press in integrate.function pushbotton1_Callback(hObject, eventdata, handles)% hObject handle to integrate (see GCBO)% eventdata reserved - to be defined in a future version of

MATLAB% handles structure with handles and user data

(see GUIDATA)figureplot(handles.uddata(:,1),handles.uddata(:,2));

Her opdaterer guidata(hObject,handles) alle de handles, som er blevet de-fineret i forbindelse med den igangværende callback og gemmer disse i struk-turfeltet. Nar de sa ønskes hentet frem, ligger de umiddelbart tilgængelige forsamtlige callbacks i denne GUI, hvorfor de direkte kan kaldes.

Det er umiddelbart den simpleste made at handtere datastrømmen mellem deenkelte callbacks / elementer.

9

3.4 Andre mader at dele data mellem de enkelte

elementfunktioner

Der er dog andre mader at dele data imellem de enkelte elementer pa. Her be-nyttes handlen til et enkelt element til at gemme data i.

Et eksempel kunne være, at den streng, som er indtastet i et Edit Text ele-ment skal benyttes til nogle udregninger. Under forudsætning af at strengen eren numerisk størrelse kan værdien direkte evalueres ved at skrive

value = eval(get(handles.edit1,’string’));

Hermed kan den uden videre bruges i beregningerne i den pagældende callback.Hvis værdien skal bruges i function edit1_callback(..,..,..) kan dettekan ogsa skrives som

value = eval(get(hObject,’string’));

da et kald til handles i det callback tilknyttet samme element kan fortages medhObject i stedet for handles.<tag>.

At eval benyttes frem for str2double til at omforme strengen til en nume-risk størrelse skyldes udelukkende, at str2double(pi) giver en fejlmeddelelse,men eval(pi) returnerer 3.1415 . . ..

Vær dog opmærksom pa, at eval ikke kan benyttes, safremt strengen har indgaeti et cell array. For at komme uden om dette problem omformes strengen vedhjælp af char pa følgende made

value = eval(char(get(handles.edit1,’string’)));

Det er ligeledes muligt at overføre en større mængde data via den eksistrendehandles-struktur. Dette kan gøres ved at benytte UserData, som er en del af alleelementer i GUIen. At gemme data i denne størrelse kan gøres ved at skrive

set(hObject,’UserData’,value)

hvis størrelsen value skal gemmes i den igangværende callback’s handle.

Til dette kan det anbefales at benytte cell array, hvis der er flere data, somskal overføres. For mere information brug help pa cell, cell2mat og deal.Dog vil et lille eksempel være illustrativt.

Det antages, at to matricer defineret som

A =[

1 43 9

]B =

1 7 4 5

3 9 11 14 1 20 2

ønskes overført via UserData. Da A og B har vidt forskellige dimensioner, kande ikke umiddelbart sammenlægges i en variabel og overføres gennem UserDatafor derefter at splittes op. Her viser cell arrays deres brugbarhed. Skrives foreksempel

10

g = {A,B};set(hObject,’UserData’,g);

dannes en variable indeholdende de to variable A og B. Nar overførslen er sketskal der blot skrives

g = get(handles.pushbutton1,’UserData’);A = cell2mat(g(1)); B = cell2mat(g(2));

og de to variable A og B er belvet overført fra handles.pushbutton1 til denpagældende callback, hvor de skal benyttes.

En GUI lukkes, ved at der skrives delete(handles.figure1) et sted i .m-filen,hvor figure1 er det tag, som er tilknyttet selve GUIen, hvorved der menesbaggrunden af GUIen.

Nu skulle de mest overordnede elementer være pa plads. I kapitel 4 bliverdet beskrevet, hvordan nogle af elementerne kan programmeres, og i kapitel5 gennemgas eksempler, som kan gøre GUIen mere brugervenlig, sasom brug afdialogbokse og diverse advarsler.

11

Kapitel 4

Programmering afelementer

I dette kapitel findes beskrivelse af mader at programmere de enkelte elementerpa. Da Static Text, Frames og Axes ikke direkte bliver tilknyttet et callbackvil programmering af disse ikke blive taget med her. Det er dog stadig mu-ligt at ændre i disse elementers egenskaber ved at benytte set(handles.<tag>,option,value) fra et andet callback. Eksempelvis vil indholdet i et StaticText element kunne ændres løbende.

4.1 Push Button

Der er intet at bemærke til programmeringen af en Push Button, da dennemest benyttes til at samle tradene efter diverse indstillinger. Derfor skal dekommandoer, der ønskes aktiveret, eller de funktioner, der ønskes kaldet, blotimplementeres pa sædvanlig made.

4.2 Toggle Button

En Toggle Button kan eventuelt bruges, hvis det ønskes at sla zoom tilknytteten specifik Axes til og fra. Dette gøres ved

function toggle1_Callback(hObject, eventdata, handles)

axes(handles.axes1); % aktivere axes1val = get(hObject, ’value’); % henter Toggle Button værdien

if val == 1zoom on;

elsezoom off;

end % Slar zoom til og fra

12

4.3 Radio Button

Ved benyttelse af Radio Buttons skal alle andre sammenhængende Radio But-tons nulstilles pa nær en. Her er det fornuftigt at benytte nummerede tags,saledes at nulstillingen kan foretages i en løkke. Dette gøres ved

function radiobutton1_Callback(hObject, eventdata, handles)

val = get(hObject,’value’);if val == 1

for i={’2’,’3’,’4’}eval(strcat(’set(handles.radiobutton’,char(i),

’,’’value’’,0)’));end

end

En anden mulighed ville være at definere følgende handle, nar der arbejdespa en GUI, som kaldes forsoeg.m. Til enhver GUI vil der i .m-filen være etabnings-callback, som i dette tilfælde hedder

function forsoeg_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;handles.group_radio = [handles.radiobutton1; ...

handles.radiobutton2; ...handles.radiobutton3];

guidata(hObject, handles);

Her er det eneste, der er tilføjet, definitionen pa det nye handle. Det er hereftermuligt, analogt til den anden fremgangsmade, at nulstille værdien for 2 ud afde 3 Radiobuttons pa følgende made

function radiobutton1_Callback(hObject, eventdata, handles)

val = get(hObject,’value’);if val == 1

set(handles.group_radio(1),’value’,1);set(handles.group_radio(2:3),’value’,0);

end

4.4 Checkbox

Forestiller man sig, at der skal benyttes en Checkbox til at angive om zoom erslaet til eller ej vil programmeringen være meget analog til den for Togglebut-tons. Denne vil være givet som

function checkbox1_Callback(hObject, eventdata, handles)

axes(handles.axes1); % aktivere axes1val = get(hObject, ’value’); % henter Checkbox værdienif val == 1

zoom on;

13

elsezoom off;

end % Slar zoom til og fra

4.5 Interaktion mellem Edit Text og Slider

I forbindelse med programmering af GUIer er det ikke muligt at udga interaktionmellem de enkelte elementer. Det følgende eksempel gar pa, at der er en Slider,som kan antage værdier i et ikke nærmere defineret interval. Desuden er deret Edit Text element, i hvilket der kan indtastes en værdi, som ligger indenfor intervallet, hvorefter Slideren bliver opdateret til denne værdi. Omvendt vilEdit Text elementet bliver opdateret, safremt der bliver ændret pa Slideren.

Figur 4.1: Eksempel pa interaktion mellem Slider og Edit Text element.

Koden til de to funktioner for henholdsvis Slider og Edit Text ser ud pa følgendemade.

function slider1_Callback(hObject, eventdata, handles)

set(handles.edit1, ’string’,num2str(get(hObject,’value’)))

%%%%%%%%

function edit1_Callback(hObject, eventdata, handles)

val = eval(get(hObject,’string’));int = [get(handles.slider1,’min’),get(handles.slider1,’max’)];

if val <= int(2) & int(1) <= valset(handles.slider1,’value’, val);

elseuiwait(warndlg(’The printed value is not in the demanded

interval’,’Warning’,’modal’))uiresume

end

Hvor den sidste else-sætning printer en fejlmeddelelse safremt den indtastedeværdi ikke ligger i intervallet [int(1),int(2)]. Hvordan sadanne benyttes oghvilke andre der findes kan ses under afsnit 5.2.

14

4.6 Listbox

I forbindelse med programmering af Listbox er det mest interessante at se pahvordan en sadan opdateres, som det eksempelvis skete i eksemplet i kapitel 1.Det er ikke interessant at se pa, hvordan algoritmen ser ud for prædefineredestørrelser, da fremgangsmade er identisk med den for Popup Menuen.

Den tekst, der star i Listboxen, kommer fra et cell array af dimensionen n×1,hvilket giver n linier i Listboxen. Nar Listboxen sa opdateres, sa arrayet er k×1og k < n, kan der opsta problemer. Det skyldes, at safremt det linienummer, derer highlighted gemmes, og hvis linienummeret er større end k kan den sammelinie ikke være aktiv efter opdateringen, og GUIen afgiver en fejlmeddelelse.Derfor anbefales det altid at angive linienummeret som værende 1 umiddelbartfør opdateringen. Den option det drejer sig om er ’value’. Et eksempel kunnese ud som følger, hvor streng er den streng, der opdateres med.

function listbox1_Callback(hObject, eventdata, handles)

streng = {’hej’,’hello’,’ciao’,’guten tag’};set(hObject,’value’,1);set(hObject,’string’,streng);

Samme problematik skal der være opmærksomhed omkring ved opdatering afPopup Menu.

4.7 Popup Menu

Indholdet i en Popup Menu er oftest defineret pa forhand i forbindelse medkodningen, sa det er kun interessant at beskrive, hvorledes kodningen ser udfor at den algoritme svarende til den valgte størrelse kan udføres. Se eksempelvis pa en Popup Menu, som den pa figur 4.2. Hvis den enkelte hilsen ønskes

Figur 4.2: Popupmenu. Henholdsvis ikke aktiv og aktiveret.

udskrevet pa skærmen, og at der skal komme en fejlmeddelelse, nar muligheden’Choose string’ vælges, ser kodningen ud som følger.

val = get(hObject,’value’);

string = get(hObject,’string’);switch val

case 1uiwait(warndlg(’Please choose a word below.’

,’OBS!’,’modal’))

15

uiresumecase {2,3,4}

disp(char(string(val)));end

Der er ikke den store forskel mellem denne kode, og hvis der skal udføres størreberegninger ved det valgte. Den eneste forskel er hvad der star under den enkeltecase.

16

Kapitel 5

Lidt ekstra

5.1 Dataoverførsel mellem GUIer

Dataoverførsel mellem to GUIer foregar ved at kalde en .m-fil fra den aktive GUI.Denne .m-fil er logisk nok koden hørende til en anden GUI. Ligesom med datao-verførsel via UserData kan en GUI kun modtage en variabel som input, hvorforsamme metode benyttes, se afsnit 3.4. Dog er det muligt at sende vilkarligtmeget data tilbage, hvilket letter opgaven en smule.

Den GUI, hvor kaldet foretages, kaldes i det efterfølgende GUI-1, og den derkaldes far navnet GUI-2. Kode i GUI-1, nar der kaldes en funktion kaldetinput_file.m:

S = {a,b,c};[A,B,C] = input_fil(S);

I GUI-2 sker da følgende, hvor dens abnings-callback ser ud pa følgende made:

function input_file_OpeningFcn(hObject, eventdata, handles, varargin)% Choose default command line output for input_filehandles.output = hObject;handles.a = (varargin{1}{1});handles.b = (varargin{1}{2});handles.c = (varargin{1}{3});% Update handles structureguidata(hObject, handles);% UIWAIT makes input_file wait for user response (see UIRESUME)% uiwait(handles.figure1);uiwait(handles.figure1);

Det væsentlige her er omformningen af data, og endvidere det vigtige, at kom-mandoen uiwait(handles.figure1) benyttes. Dette betyder, at GUIen ikkesom default returnerer en ligegyldig værdi, men venter til at de variable, derskal returneres, er genereret. Dette kunne for eksempel ske som følger

function varargout = input_file_OutputFcn(hObject, eventdata,handles)

17

% Get default command line output from handles structurevarargout{1} = handles.a;varargout{2} = handles.b;varargout{3} = handles.c;

% --- Executes on button press in pushbutton1.function pushbutton1_Callback(hObject, eventdata, handles)

handles.a = handles.a * 2;handles.b = handles.b * pi;handles.c = handles.c * 3;guidata(hObject,handles);uiresume(handles.figure1)

Her finder det mest interessante sted med kommandoen uiresume(handles.figure1),for det giver GUIen lov til at eksekvere det callback, der hedder input_file_OutputFcn,som returnerer de variable, der skal returneres.

Dette er helt overordnet den fremgangsmade, der skal benyttes med datao-verførsel mellem GUIer.

5.2 Dialogbokse

Dialogbokse kan være særdeles anvendelige, hvis brugeren skal gøres opmærk-som pa en opstaet fejl, eller der er brug for, at brugeren verificerer sit valg.Eksempelvis kan der ønskes bekræftet, om GUIen skal lukkes eller ej. Dialog-bokse kan være de i MatLab indbyggede, ellers kan de konstrueres efter ensegne ønsker.

5.2.1 Indbyggende dialogbokse

De dialogbokse som vil blive behandlet her, er dem, som er indbygget i Matlab.De fungerer generelt ens, hvorfor der henvises til help pa msgbox, questdlg,errordlg, warndlg, helpdlg og textwrap.

Herunder vil der dog blive givet et eksempel pa, hvorledes sadan en dialog-boks vil kunne se ud. Det vil dreje sig om en forespørgsel til brugeren om detønskes, at programmet skal lukkes, hvor valgmulighederne er ’Yes’, ’No’ eller’Cancel’. Dette gøres pa følgende made

function pushbutton1_callback(hObject, eventdata, handles)% denne funktion lukker GUIen

quest = questdlg({’Do you really want’,’to close this current’,’session?’,’’},’Question’,’No’);

if quest == ’Yes’delete(handles.figure1)

end

Kaldet til questdlg abner en dialogboks, se figur 5.1, i hvilken der er en 4-liniers tekst, hvoraf der er tekst pa 3 af dem. Det er fordelen ved at benytte

18

cell array til at indtaste en tekststreng, da det kan styres, hvor strengen skaldeles. Den sidste del af kaldet, hvor der star skrevet ’No’ angiver hvilken af detre valgmuligheder, der skal være prædefineret som default.

Figur 5.1: Den beskrevne dialogboks.

5.3 Indsættelse af iconer

Iconer indsættes pa de enkelte elementer pa en meget simpel made. Dette gøresved at danne en M×N×3 matrix i Matlab udelukkende indeholdende værdier iintervallet [0, 1], og gemme denne matrix som en variabel. Denne matrix define-rer billedet i farver. Intervallet er netop [0, 1], da en farve i Matlab er defineretsom RGB farve, hvor hver af farverne rød, grøn og bla repræsenteres af en nu-meriske værdi mellem netop 0 og 1.

Herefter markeres det element i GUIDE, som iconet skal tilknyttes og i Pro-perty Inspector findes den parameter, som hedder CData. Nar denne vælgeskommer der et figurefelt op, i hvilket der star Enter expression, hvor varia-belnavnet skrives. Hermed er iconet tilføjet.

Det er dog væsentligt, at variablen ligger i workspace, da den ellers ikke viloptræde som en kendt variable, og derfor ikke vil være mulig at inkludere somet icon.

5.4 Print af plot i en GUI

Jeg vil nu komme med en meget besværlig fremgangsmade, men det er ifølgeMathworks den eneste mulighed, da det ikke er muligt at printe en Axes, menkun et helt figurfelt, hvilket vil mene hele GUIen. Den kode, der skal bruges er

figure % Create a new figureaxes % Create an axes object in the figurenew_handle = copyobj(handles.printet,gca);eval(char(strcat(’print -depsc’,{’’},{’ ’}, <file_name>)));close(gcf)

hvor handles.printet er et handle, som er genereret i forbindelse med plottetaf det, som ønskes printet. Dette handle er genereret pa følgende made

19

handles.printet = plot(x,y);guidata(hObject, handles);

Det, der reelt sker i forbindelse med afvikling af denne printkommando, er liniefor linie:

1. Der abnes et nyt figurvindue.

2. Der abnes en Axes i dette figurvindue.

3. Det som ligeledes er plottet i GUIen kopieres over i den nye Axes.

4. Denne figur er et normalt figurfelt, sa det kan plottes uden at overflødigeting kommer med.

5. Dette midlertidige figurfelt lukkes og man er tilbage i GUIen.

Besværligt ja, men det virker.

5.4.1 Flere Axes i en GUI

Nar der er flere Axes i en GUI skal man sikre sig, at det er den rigtige Axes,der bliver plottet i. Dette klares simpelt ved at benytte følgende kommando førhvert plot

axes(handles.<tag>)

Dette gør, at den Axes med det pagældende tag aktiveres, og det er i denneplottet foretages.

20

Kapitel 6

Appendix

6.1 Sma tricks

• I MatLabs teksteditor er det muligt at springe rundt i funktionerne vedhjælp af Show function, som kan findes i værktøjsbjælken.

• Hvis det ønskes at opdatere handle i et callback, der tilhører det element,som ønskes opdateret, behøver det ikke at blive kaldt med handles.<tag>,men det er tilstrækkeligt at skrive hObject.

6.2 Ting, som skal huskes

• Husk at ændre tags inden .m-filen dannes, da det er besværligt at ændresenerehen.

• Husk at units pa alle elementer skal være identiske for at kunne brugeGUIen pa computere med forskellige skærmopløsninger.

6.3 Kode til frembringelse af lup-icon

% function LUP%% Ved at kalde denne funktion faas data til en togglebuttom i

Matlab GUI,% som passer i stoerrelsen 19 * 19 pixles. Data indlaegges i GUIen

ved at% indlaese dataen i CData. Dette goeres ved, at indtastes

variabelnavnet% under ’Enter expression’.% colordef er en vektor indeholdende 3 elementer, nemlig

colordef = [red,% blue, green], hvor disse stoerrelser hver ligger i intervallet

[0, 1].

function b = lup(colordef)

21

b(:,:,1) = colordef(1) * ones(14); b(:,:,2) = colordef(2) * ones(14);b(:,:,3) = colordef(3) * ones(14);

b(2,5:7,:) = 0; b(3,4,:) = 0; b(3,8,:) = 0; b(4,3,:) = 0; b(4,6,:) = 0;b(4,9,:) = 0; b(5,2,:) = 0; b(5,6,:) = 0; b(5,10,:) = 0; b(6,2,:) = 0;b(6,4:8,:) = 0; b(6,10,:) = 0; b(7,2,:) = 0; b(7,6,:) = 0;b(7,10,:) = 0; b(8,3,:) = 0; b(8,6,:) = 0; b(8,9,:) = 0; b(9,4,:) = 0;b(9,8:10,:) = 0; b(10,5:7,:) = 0; b(10,9:11,:) = 0; b(11,10:12,:) = 0;b(12,11:13,:) = 0; b(13,12:13,:) = 0;

22