Uživatelské aplikace návrh GUI části programu v Matlabu přednáška předmětu A2B99MAA, 12.týden
Miloslav Čapek K13117, B2-819
Obsah přednášky
grafické rozhraní jako část programu
koncepce v Matlabu, identifikátory objektů
vlastnosti grafických objektů (set, get, uložení reference)
callback funkce (tvorba, volání, editace)
jednotlivé grafické objekty – přehled
I.
root (funkce monitor), figure axes, axis ui-objekty kontextové menu, kurzor, ikony, menu předdefinované bloky
techniky návrhu grafického rozhraní
návrh jednoduchého programu (rozbor, návrh, test)
6.5.2010 23:54
příklady realizovaných aplikací
dotazy, diskuze
literatura
program cvičení
II.
Programování v MATLABu
ZNALOST tvorby funkčního kódu (funkce, matice, indexace)
ZNALOST tvorby vlastních funkcí (hlavní, vedlejší, …)
ZNALOST efektivního návrhu a programování Matlabu GUI
TVORBA plnohodnotné aplikace/toolboxu/…
6.5.2010 23:54
1/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
GUI (Graphical User Interface) uživatel
user
? aplikace
GUI function3 function1
function2
GUI: Rozhraní, které umožňuje uživateli působit na běh programu a program jako takový ovládat. 6.5.2010 23:54
2/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Příklad grafického rozhraní
Počáteční stav
Konečný stav funkce programu
1) co má GUI umět (všechny funkce a ability budoucí aplikace) ? 2) vstupy, výstupy a práva uživatele 3) seznam operací, event. nákres na papír
6.5.2010 23:54
3/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
GUI v Matlabu – ukázky1
6.5.2010 23:54
4/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
GUI v Matlabu – ukázky2
6.5.2010 23:54
5/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
GUI v Matlabu – ukázky3
6.5.2010 23:54
6/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Koncepce grafického systému Matlabu
grafické funkce Matlabu lze rozdělit na:
funkce vyšší úrovně funkce nižší úrovně
funkce obsluhují v obou případech sadu grafických objektů (většina bude probrána dále)
na vyšší úrovni přistupujeme k jednotlivým funkcím a vlastnosti objektů ovlivňujeme pouze parametry volané funkce na nižší úrovni vyvoláváme přímo objekty a pracujeme s nimi (můžeme tedy měnit fonty, barvy, tloušťky čar a další)
6.5.2010 23:54
7/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
2D grafy v Matlabu (vyšší úroveň)
root
>> plot(linspace(1,10,10)) >> stem(linspace(1,10,10))
>> % … a další
6.5.2010 23:54
8/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
3D grafy v Matlabu (vyšší úroveň)
root
>> >> >> >> 6.5.2010 23:54
9/63
[X,Y] = meshgrid(-3:.125:3); Z = sin(X) + cos(Y); mesh(X,Y,Z); axis([-3 3 -3 3 -2 2])
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Z čeho je složen GUI Matlabu? monitor ~ root okno aplikace ~ figure
kreslící prostor ~ axes
grafické prvky ~ uiobjects
A2B99MAA (12.týden): Tvorba uživatelských aplikací
10/63
Miloslav Čapek,
[email protected]
Nižší úroveň tvorby grafiky v Matlabu objekty jsou rozděleny podle logické závislosti
root
uibottongroup
figure
uiobjects
uicontrol uicontextmenu
axes
uimenu
Core objects Plot objects
line, text, surface, patch, image,
…
…
Group objects
…
Annotation objects
…
uitoolbar
uipushtool uitoggletool
uitable
kompletní rozdělení je velmi komplikované
6.5.2010 23:54
11/63
uipanel
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Přehled ui- objektů
uitoolbar
uimenu uitable
uicontextmenu
uipanel uibottongroup uicontrol
A2B99MAA (12.týden): Tvorba uživatelských aplikací
12/63
Miloslav Čapek,
[email protected]
Přehled uicontrol text
edit popupmenu
pushbutton
checkbox
slider
togglebutton radiobutton listbox
uitable
axes
uibuttongroup
uipanel
A2B99MAA (12.týden): Tvorba uživatelských aplikací
13/63
Miloslav Čapek,
[email protected]
Příklad: moje tlačítko (uiobjekt)
vytvořím tlačítko ‚moje tlačítko‘ klik…
% pushRef: reference na objekt % ‘moje tlačítko‘ % event: další informace o události … telo funkce end
vlastnost
moje tlačítko
možná nastavení
typ uiobjektu
‘pushbutton‘
‘edit‘ / ‘text‘ / …
font písma
‘MS Sans Serif‘
‘Arial‘ / ‘Verdana‘ / …
velikost písma
11
{1,…}
řez písma
‘bold‘
‘normal‘ / ‘italic‘
barva písma
‘k‘ (black)
[r g b]
rozměr tlačítka
‘normalized‘ / ‘pixels‘
umístění tlačítka
[0.48 0.84 0.2 0.13] ‘normalized‘
[x1 y1 x_size y_size] (viz dále)
barva tlačítka
‘y‘
[r g b]
callback funkce
@myFunc(scr,evnt)
jakákoliv definice callback funkce
6.5.2010 23:54
14/63
function myFunc(pushRef,event) % tato funkce je vedlejsi
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Identifikátor objektu (handle)
Každý samostaný objekt má svůj identifikátor (řečí Matlabu handle). Tyto handely jsou v podstatě referencí na existující objekt. Handle Matlab vytvoří vždy, je na uživateli jeho uchování. Složité grafy (vrstevnice) mohou mít více identifikátorů. root má vždy handle = 0, figure zpravidla celé kladné číslo, ostatní objekty mají za handle kladné reálné číslo. handely
Číslo uložené v proměnné figHandle existuje i po uzavření okna, již se ale nejedná o handle.
6.5.2010 23:54
15/63
>> figHandle = figure; >> axHandle = axes;
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Vlastnosti objektu
všechny objekty mají množinu vlastností, které říkají, jak bude objekt zobrazen a jak s ním bude zacházeno objekt je tvořen množinou implicitních hodnot vlastností tyto hodnoty můžeme číst a ve většině případů i nastavit názvy vlastností nejsou cAsE sEnSiTiVe, dokonce lze některé názvy vlastností i zkrátit, pokud stále vyjadřují danou vlastnost >> >> >> >>
vlastnosti lze definovat dvojím způsobem:
6.5.2010 23:54
16/63
figure('Color','b'); figure('color','b'); figHandle = figure('Position',[100 100 200 200]); figHandle = figure('pos',[100 100 200 200]);
při vzniku objektu později po vytvoření objektu pomocí funkce set A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Společné vlastnosti
následující vlastnosti jsou společné všem objektům:
ButtonDownFcn
Funkce, která se spustí při stisku myši nad objektem axes. Bude popsáno dále.
Children
Identifikátory (handely) všech potomků tohoto objektu.
Clipping
Umožní / zakáže ořezávání.
CreateFcn, DeleteFcn
Funkce, která se spustí při vytvoření (před zobrazením) / smazání objektu.
ChangeFcn
Funkce, která se spustí při změně objektu.
BusyAction
Řídí mód přerušení callback funkcí (řazení do fronty / zahazování).
HandleVisibility
Určuje viditelnost identifikátorů objektů.
Interruptible
Určuje, zda je možno přerušit callback funkci (její vykonávání).
Parent
Identifikátor rodiče (nadřazeného objektu, viz schéma).
Selected
Indikuje, zda byl objekt vybrán – můžeme se ptát, zda je objekt aktivní.
SelectionHighlight
Určuje, zda se objekt po vybrání zvýrazní.
Tag
Uživatelem specifikovaný popis objektu (vhodný pro pozdější správu a hledání obj).
Type
Typ objektu (‘figure ‘ / ‘edit‘ / ‘text ‘ / …)
UserData
Místo, kam si může uživatel uložit libovolná data pro vlastní použití.
Visible
Určuje, zda je objekt viditelný.
6.5.2010 23:54
17/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Funkce set
pokud jsme nenastavili hodnotu vlastnosti při vzniku objektu, nebo ji chceme změnit, použijeme funkci set set(Hndl,'PropertyName',PropertyValue,...)
vytvoříme osy
>> axes;
dodatečně změníme jejich barvu
>> set(gca,'Color','y');
dodatečně přidáme y-ovou mřížku
>> set(gca,'YGrid','on');
funkce set lze využít na všechny grafické objekty
6.5.2010 23:54
18/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Funkce get
můžeme vyvolat hodnotu vlastnosti grafického objektu PropertyValue = get(h,'PropertyName');
ponechme strukturu z minulého slajdu a najděme barvu a velikost os >> axColor = get(gca,'Color') axColor = 1 1 0 >> axSize = get(gca,'pos') axSize = 0.1300 0.1100 0.7750
funkce get lze využít na všechny grafické objekty, více informací viz help get
6.5.2010 23:54
19/63
0.8150
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Implicitní vlastnosti
všechny vlastnosti mají své implicitní (~defaultní) hodnoty lze definovat i vlastní implicitní hodnoty postup hledání (dokud není nalezena implicitní hodnota zadaná uživatelem, nebo vestavěná)
aktuální objekt postupně předci objektu >> set(gcf,‘DefaultLineColor‘,‘w‘)
na jaký(é) objekt(y)
typ objektu
vlastnost
zadáním hodnoty ‘factory‘ nastavíme vlastnost na vestavěnou hodnotu pokud chceme definovat některé hodnoty trvale (vždy), využijeme skript startup.m popisovaný v minulé přednášce
6.5.2010 23:54
20/63
klíč. slovo
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
GUI: pozice a rozměry Matlab slučuje velikost objektu a jeho umístění do jedné matice dva způsoby zadání
absolutně v pixelech (A) normalizovaně (B)
[left bottom width height]
%% A) uicontrol('Units',Pixels',... 'Style','Text','Position',[50 150 75 25],... %% B) uicontrol('Units','Normalized',... 'Style','Text','Position',[.05 .12 0.075 0.02],... 6.5.2010 23:54
21/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Callback funkce
Nad každým objektem jsou definované operace, které může uživatel využít (klik na tlačítko, výběr z nabídky, …). Tyto operace jsou obsluhovány pomocí tzv. callback funkcí. Jinak řečeno, pokud uživatel klikne na tlačítko, aktivuje se callback funkce této události (je-li definována). Pokud nemá být GUI statický, musí vždy obsahovat alespoň jednu callback funkci. Hodnoty callback funkcí jsou uloženy jako vlastnosti objektu – lze je měnit, mazat, kopírovat…
function soucet(a,b) % secte dve zadana cisla … vytvoreni GUIe, definice callback funkce … (funkce na zadani hodnot) function mojeTlacitko(hndl,evnt) … telo vedlejsi funkce end end
6.5.2010 23:54
22/63
klik…
aktivace callback funkce
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
function mojeTlacitko(hndl,evnt) % provede secteni cisel … nacti hodnoty a, b c = a + b; … uloz c, resp. vypis vysledky end
Typy callback funkcí Callback
Provedemenu, context se při uiobjects typickém užití ui komponenty (klik tlačítka, vyběr menu,...).
CellEditCallback
Reaguje na změnu hodnoty v tabulce uitable. uitable
CellSelectionCallback
Reaguje na výběr libovolné buňky v tabulce uitable. uitable
ButtonDownFcn
Vyhodnotí axes, figure, sebutton vždy, když group, je panel, kurzoruiobjects nad objektem axes a klikne se myší.
ClickedCallback
Reaguje push tool,natoggle klik myši tool na tlačítka push nebo toggle.
CreateFcn, DeleteFcn
Vyhodnotí axes, button segroup, právě context pokud jemenu, daný objekt figure, vytvořen menu, panel, / smazán. uiobjects, …
OffCallback, OnCallback
Vyhodnotí toggle tool se, pokud je stav toggle tlačítka změněn na off / on.
ResizeFcn
Aktivujepanel, figure, se, když button uživatel groupzmění velikost figure, panel nebo button group.
SelectionChangeFcn
Reaguje button group na změnu aktivního knoflíku, nebo toggle tlačítka ve skupině.
KeyPressFcn
Zavolá uiobjects figure, callback, pokud je stisknuta klávesa (a figure aktivní).
KeyReleaseFcn
Zavolá callback, pokud je uvolněn stisk klávesy (a figure aktivní). figure
WindowButtonDownFcn
Reaguje na klik myši (libovolné tlačítko) uvnitř figure. figure
WindowButtonMotionFcn
Reaguje na pohyb myši uvnitř figure. figure
WindowButtonUpFcn
Reaguje na uvolnění stisku tlačítka myši (libovolné tlačítko) uvnitř figure. figure
WindowKeyPressFcn
Reaguje na stisk (tl/kl), pokud je figure nebo některý jeho potomek aktivní. figure
WindowKeyReleaseFcn
Reaguje na uvolnění stisku (tlačítka/klávesy), pokud je figure nebo -//-. figure
WindowScrollWheelFcn
Reaguje na pohyb rolovacího kolečka myši (pokud je figure aktivní). figure
CloseRequestFcn
Volá callback funkci právě pokud je uzavíráno aktivní okno figure. figure
6.5.2010 23:54
23/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Vyhodnocení callback funkce
zpravidla má každá eventualita vlastní callback (výběr ‘Ano‘ má jiný callback než výběr ‘Ne‘) callback funkce je vyhodnocena jako řetězec (funkcí) eval je vyhodnocena v základním pracovním prostoru Matlabu tomu odpovídají možné strategie zápisu:
>> hb = uicontrol('Style','pushbutton','String','Plot line') >> set(hb,'Callback','plot(rand(20,3))') % definice callback funkce >> set(hb,'Callback','plot(myvar)') % zmena callback funkce
figure uicontrol('Style','slider', ... 'Callback',@dispSliderValue);
function display_slider_value(... hObject,eventdata) disp(['Slider moved to ' ... num2str(get(hObject,'Value'))]);
set(hb,'CallBack',@(scr,event)plotFcn(xData,yData,graphColor));
6.5.2010 23:54
24/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Funkce findobj
najde objekt(y) s požadovanou vlastností vrací jejich identifikátor (event. pole indentifikátorů) h = findobj h = findobj('PropertyName',PropertyValue,...)
>> >> >> >>
figHndl = gcf % figHndl = figure; axsHndl = gca % axsHndl = figure; htx1 = uicontrol('style','text','string','hello','tag','tx'); htx2 = uicontrol('style','text','string','test1','tag','tx2'); >> h = findobj('Style','text') h = 0.0072 171.0071 >> h = findobj('Style','text','-and','Tag','tx') h = 0.0072
6.5.2010 23:54
25/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Funkce findall, allchild findall: najde všechny grafické objekty (včetně skrytých), handle_list může být např. gcf
object_handles = findall(handle_list) object_handles = findall(handle_list,'property','value',...)
allchild: najde všechny potomky vybraného objektu (včetně skrytých) pokud je handle_list vektor indentifikátorů, vrací Matlab pole buněk child_handles = allchild(handle_list)
empty matrix
6.5.2010 23:54
26/63
>> axes >> get(gca,'Children') >> allchild(gca)
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
4 handely
Funkce gcf, gca a gco
slouží k jednoduchému přístupu k identifikátorům objektů, které jsou právě aktivní, konkrétně jde o:
gcf (vrací identifikátor aktuálního objektu figure) gca (vrací identifikátor aktuálního objektu axes) gco (vrací identifikátor objektu, na který se naposledy kliklo myší, tolerance u čar je 5 pixelů) >> figure >> figHandle = gcf;
tyto funkce můžeme využít jako vstupní identifikátor pro jiné funkce vyžadující handle objektu figure nebo axes >> set(gcf,'Color',[0 0 0])
6.5.2010 23:54
27/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Funkce ishandle
jedna z mnoha funkcí detekujících stav v Matlabu (is*) ishandle vrací true, je-li argument funkce handle, v opačném případě vrací false
>> figHndl = figure; >> ishandle(figHndl) ans = 1 >> delete(figHndl) >> ishandle(figHndl) ans = 0
6.5.2010 23:54
28/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Funkce copyobj
tyto funkce umožňují ovlivnit životní cyklu objektu copyobj: zkopíruje objekt a jeho potomky new_handle = copyobj(h,p) >> hf = figure >> ha = axes >> hl1 = line([.1 .8],[0.5 0.5]) >> hl2 = copyobj(hl1,ha) >> ishandle(hl1) && ishandle(hl2) ans = 1
6.5.2010 23:54
29/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Funkce delete a reset
tyto funkce umožňují ovlivnit životní cyklu objektu delete: odstraní soubor(y) nebo grafický objekt(y) i s jeho potomky delete(fileName1, filename2, ...) delete(handle_array) >> delete(hf) % viz predesly priklad >> ishandle(hl1) && ishandle(hl2) ans = 0
reset: nastaví všechny hodnoty objektu zpět na implicitní reset(h)
6.5.2010 23:54
30/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
root (vlastnosti monitoru) v Matlabu odpovídá obrazovce počítače je unikátní (handle = 0) → všechny další objekty jsou potomky
>> dispNfo = get(0); >> dispSize = get(0,‘ScreenSize‘); >> figSize = [400 200]; >> figHndl = figure(‘pos‘,... [(dispSize(3)-figSize(1))/2 ... (dispSize(4)-figSize(2))/2 ... figSize(1) figSize(2)]); [left bottom width height]
200
400
[760 500] 6.5.2010 23:54
31/63
vytvoří okno (figure) o velikosti figSize(1) x figSize(2) přesně uprostřed obrazovky A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
figure
objekt figure vytváří samostatné grafické okno všechny event. okna jsou potomkem objektu root všechny podružné grafické objekty jsou potomkem objektu figure a jsou v daném okně zobrazeny voláme-li podružnou funkci bez existence okna, vytvoří se nové figure má mnoho vlastností (viz get(figure))
>> figure;
6.5.2010 23:54
32/63
>> figHandle = ... figure(‘Color‘,‘r‘);
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
>> axes;
axes, axis
definují oblast v grafickém okně, kam jsou umísťovány potomci objektu axes nejčastější využití axes ja jako os grafu/obrázku (2D i 3D) všechny podružné objekty k objektu axes generují osy i pokud zatím neexistují (podobně jako u figure) axes má mnoho vlastností (viz get(axes))
>> line([.1 .9],[0 1],'LineWidth',3) >> axis([0 1 0 1]) >> figHndl = gcf figHndl = 1 >> axsHndl = gca axsHndl = 171.0031 >> line([.8 .2],[.1 .6],'LineWidth',2) >> axis([0 2 0 1]) 6.5.2010 23:54
33/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
line, patch, surface, image, text
line: využíváme při tvorbě grafů (plot, plot3, contour,…) patch: vyplněné (barevné) mnohoúhelníky, funkce fill, fill3 surface: čtyřúhelníky (vrcholy definované prvky třírozměrné matice), mohou být kresleny jako plné (pcolor, surf), barevně interpolované, nebo drátové (mesh) image: výsledek transformace prvků matice na indexy aktuální mapy barev (generovány funkcí image) text: znakové řetězce (text, gtext, title, xlabel,ylabel,zlabel) všechny tyto objekty jsou potomky objektu axes (tj. lze je realizovat pouze nad tímto objektem – vykreslení v osách) ke všem objektům lze přistupovat i přímo, tvořit je, nastavovat a měnit jejich vlastnosti, kopírovat a mazat je
6.5.2010 23:54
34/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Skupina uiobjects: uimenu
lze definovat klávesové zkratky (např. CTRL+L) v menu se lze pohybovat pomocí ALT+písmeno callback funkce lze přiřadit 490 řádek kódu
uiobjects uimenu uicontextmenu uipanel uitoolbar uicontrol uitable uibottongroup
více viz help uimenu
6.5.2010 23:54
35/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Skupina uiobjects: uicontextmenu
vytvoří kontextové menu lze ho vyvolat pravým klikem myši výběr položky z menu aktivuje zadaný callback
uiobjects uimenu uicontextmenu uipanel uitoolbar uicontrol uitable
>> >> >> >> >>
figHndl = figure; uibottongroup cMenu = uicontextmenu; axsHndl = axes('Parent',figHndl,'UIContextMenu',cMenu); uimenu(cMenu,'Label','vyber1','Callback',@callbackFcn1); uimenu(cMenu,'Label','vyber2','Callback',@callbackFcn2,... 'Separator','on'); >> uimenu(cMenu,'Label','vyber3','Callback',@callbackFcn3); 6.5.2010 23:54
36/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Skupina uiobjects: uipanel
vytvoří panel, který je rodičem dalších objektů (uicontrol) objekty uvnitř jsou orientovány vzhledem k panelu uiobjects uimenu uicontextmenu uipanel
>> fgHnd = figure; >> h1p = uipanel('Title','hlavni panel',... 'FontSize',12,'BackgroundColor',... 'white','Position',[.25 .25 .4 .25]); >> h2p = uipanel('Parent',h1p,... 'Title','sub-panel','FontSize',12,... 'Position',[.25 .25 .7 .7]);
uicontrol uitable uibottongroup
lze nastavovat barvu pozadí, šírku rámečku a mnoho dalšího více viz help uipanel
6.5.2010 23:54
37/63
uitoolbar
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Skupina uiobjects: uitable
vytvoří 2D tabulku, komponent může být umístěn kdekoliv v okně figure uiobjects uimenu uicontextmenu uipanel uitoolbar
>> >> >> >>
uicontrol uitable uibottongroup
tabulka může mít celou řadu vlastností i prvků (check, popup) callback funkce výběru změny buňky, více viz help uitable
6.5.2010 23:54
38/63
figure t = uitable; set(t,'Data',magic(10)); set(t,'ColumnWidth',{35})
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Skupina uicontrol: text
umístí na zvolené místo text zpravidla se využívá jako popiska dalších prvků nebo informační text pro uživatele lze nastavit font, řez, velikost, barva (textu i pozadí), …
uicontrol text edit pushbutton
>> figure >> text1 = uicontrol(... 'Units','Normalized',... 'Style','Text',... 'Position',[.35 .45 0.3 0.1],... 'Tag','txtMAA1',... 'FontSize',10,... 'BackgroundColor',[.8 .5 .8],... 'HorizontalAlignment','center',... 'String','Toto je text k MAA');
6.5.2010 23:54
39/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
togglebutton radiobutton checkbox listbox slider popupmenu
Skupina uicontrol: edit
umožňuje načíst řetězec programátor si tento řetězec musí dále zpracovat (užití funkcí str2num, str2double atp.) uživatel může pracovat i pomocí (CTRL+C,V,X,A,H) string obsahuje vložený řetězec pomocí edit lze vytvořit v Matlabu např. konzoly
uicontrol text edit pushbutton togglebutton radiobutton checkbox listbox slider popupmenu
6.5.2010 23:54
40/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Skupina uicontrol: pushbutton
jednostavové tlačítko callback funkce je vyvolána jeho stisknutím nastavení vzhledu je podobné jako u objektu text
uicontrol text edit pushbutton togglebutton radiobutton checkbox listbox slider popupmenu
6.5.2010 23:54
41/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Skupina uicontrol: radiobutton
stavy vybrán – nevybrán (hodnoty max-min) uicontrol
tyto prvky lze sdružovat do větších skupin → button group (objekt uibuttongroup) při vyvolání callback funkce lze získat informaci z kterého prvku uživatel přepnul na který
text edit pushbutton togglebutton radiobutton checkbox listbox slider popupmenu
6.5.2010 23:54
42/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Skupina uicontrol: checkbox
podobné jako radiobutton zaškrtávácí políčko (s doprovodným textem) callback vyvolán změnou stavu
uicontrol text edit
function checkboxFcn(hObj) % osetreno %% zjisteni, zda je check vybran if (get(hObject,'Value') % vybran % ... else % nevybran % ... end
pushbutton togglebutton radiobutton checkbox listbox slider popupmenu
6.5.2010 23:54
43/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Skupina uicontrol: listbox
zobrazuje seznam, lze vybrat jednu nebo i více položek vlastnost string obsahuje seznam řetězců (položek) vlastnost value obsahuje matici vybraných položek hodnoty max a min ovlivňují výběr
uicontrol text edit pushbutton togglebutton radiobutton checkbox listbox slider popupmenu
6.5.2010 23:54
44/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Skupina uicontrol: slider
na vstupu numerický rozsah (min-max) uživatel se pohybuje po skocích (sliderstep) jezdcem uicontrol text
Požadujeme: rozsah: <2,10> krok tažením: 0.4 krok kliknutím: 1 počáteční hodnota: 6.5 slider_step(1) = 0.4/(10-2); slider_step(2) = 1/(10-2); set(sliderHndl,‘sliderstep‘,... slider_step,‘max‘,10,... ‘min‘,2,‘Value‘,6.5);
6.5.2010 23:54
45/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
edit pushbutton togglebutton radiobutton checkbox listbox slider popupmenu
Skupina uicontrol: popupmenu
klik na šipku zobrazí seznam, z něj lze vybrat jednu položku string obsahuje seznam řetězců uicontrol value obsahuje index vybrané položky text edit pushbutton
function popupFcn(hObj) % osetreno val = get(hObj,'Value'); string_list = get(hObj,'String'); selected_string = string_list{val}; % ...
togglebutton radiobutton checkbox listbox slider popupmenu
6.5.2010 23:54
46/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
uitoolbar, colormap funkce lze využívat i ve vlastním GUIi (brush, pan, zoom, datacursormode) klik → volání vlastní callback funkce
takto je ikona ‘nakreslena‘ v m-souboru pics = [1 1 1 1 1 .6 .6 .6 1 .6 1 1 1 .6 1 0 1 .6 1 0 1 .6 1 0 1 .6 1 0 1 .6 1 0 1 .6 1 0 1 .6 1 0 1 .6 1 1 1 .6 1 1 1 .6 1 1 1 .6 1 1 1 .6 .6 .6 1 1 1 1 icon(:,:,1) = .85. icon(:,:,2) = .98. icon(:,:,3) = .85.
6.5.2010 23:54
47/63
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1;... .6 .6 .6 .6 .6 .6 .6 .6 .6 .6 .6 .6 .6 .6 .6 1;... 1 1 1 1 1 1 1 1 1 1 1 1 1 1 .6 1;... 0 0 1 0 0 0 0 0 1 1 1 1 1 1 .6 1;... 1 1 0 1 1 0 1 1 1 1 1 1 1 1 .6 1;... 1 1 0 1 1 0 1 1 1 1 1 1 1 1 .6 1;... 0 0 1 1 1 0 1 1 1 1 1 1 1 1 .6 1;... 1 1 1 1 1 0 1 1 1 0 0 0 0 1 .6 1;... 1 1 1 1 1 0 1 1 1 1 1 0 0 1 .6 1;... 1 1 1 1 1 0 1 1 1 1 0 1 0 1 .6 1;... 1 1 1 1 1 1 1 1 1 0 1 1 0 1 .6 1;... 1 1 1 1 1 1 1 1 0 1 1 1 1 1 .6 1;... 1 1 1 1 1 1 1 0 1 1 1 1 1 1 .6 1;... 1 1 1 1 1 1 1 1 1 1 1 1 1 1 .6 1;... .6 .6 .6 .6 .6 .6 .6 .6 .6 .6 .6 .6 .6 .6 .6 1;... 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]; * pics; * pics; * pics;
vlastní barevné mapy, vlastní rozsahy, …
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Dialogové boxy v Matlabu
nejčastější operace uživatel ↔ GUI jsou předdefinovány ty nejužívanější jsou zobrazeny níže (většina):
→ user
helpdlg
msgbox
warndlg
→ GUI
inputdlg
listdlg
questdlg
file
uigetdir
uigetfile
uiopen
→ file
uiputfile
uisave
→ user
waitbar
6.5.2010 23:54
48/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
errordlg
Příklad1: msgbox
msgbox
zobrazí zprávu pro uživatele
h = msgbox(Message,Title); h = msgbox(Message,Title,'custom',IconData,IconCMap); >> h = msgbox({'Toto je zprava pro studenty MAA.', ... 'ZDE muze byt text'},'Moje zprava')
6.5.2010 23:54
49/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Příklad2: questdlg
questdlg
zobrazí otázku, vrátí odpověď (okno je modal)
button = questdlg('qstring') button = questdlg('qstring','title', ... 'str1','str2','str3',default) >> button = questdlg('Ukoncit aplikaci?', ... 'Konec aplikace','Ano','Ne','Ano')
6.5.2010 23:54
50/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Příklad3: uigetfile
uigetfile
uživatel může vybrat soubor(y) ze souborového systému
uigetfile [FileName,PathName,FilterIndex] = uigetfile(... FilterSpec,DialogTitle,DefaultName) >> [FileName,PathName] = ... uigetfile('*.m', ... 'Select the M-file');
6.5.2010 23:54
51/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Příklad4: uiputfile
uiputfile
otevře dialog pro ukládání soubor(ů)
uiputfile [FileName,PathName,FilterIndex] = uiputfile(... FilterSpec,DialogTitle,DefaultName) >> [file,path] = ... uiputfile('*.mat',... 'Ulozit workspace jako:', ... 'defaultFile.mat')
6.5.2010 23:54
52/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Příklad5: waitbar
waitbar
zobrazuje stav procesu
h = waitbar(x,'message') waitbar(x,'message',property_name,property_value,...)
>> h = waitbar(0,'Please wait...'); kroku = 1000; for i = 1:kroku waitbar(i/kroku); end close(h);
6.5.2010 23:54
53/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Techniky návrhu GUI - rozdělení
existuje několik přístupů (metodik) na tvorbu GUIe
návrh pomocí nástroje GUIDE
switch-board technika
využití vedlejších a nested funkcí jako callback funkcí
plně OOP přístup (vč. OO funkční části kódů)
6.5.2010 23:54
54/63
>> guide
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Uchovávání dat v GUI
Jak uchovávat data (zadaná i handely objektů) v GUI?
globální proměnné (krajní možnost)
použití vlastnosti UserData (záleží na velikosti aplikace)
použití funkcí guidata nebo setappdata a getappdata
plně OOP přístup (vč. OO funkční části kódů, i tak se neubráníme využití jedné z výše uvedených strategií)
6.5.2010 23:54
55/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Funkce guidata
funkce umožňuje uložit nebo získat GUI data usnadňuje programátorovi přístup k datům (rozhraní) postup bývá následující:
získáme kopii dat data = guidata(object_handle) provedeme změnu dat / potřebný výpočet pokud se data změnila, uložíme guidata(object_handle,data) guidata(object_handle,data) data = guidata(object_handle)
>> fhndl = figure(‘Toolbar‘,‘none‘); >> allFigHndl = guihandles(fhndl); >> guidata(fhndl,allFigHndl); function myCallback() % ... myAllFigHndl = guidata(gcbo); myAllFigHndl.time = clock; Guidata(gcbo,myAllFigHndl); 6.5.2010 23:54
56/63
funkce guihandles vrací indentifikátory všech viditelných objektů ve figure funkce gcbo vrací identifikátor objektu, jehož callback je právě vyhodnocován
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Funkce setappdata a getappdata
setappdata: umožní definovat nová data (dvojice jménohodnota) pro danou aplikaci setappdata(object_handle,'name',value)
getappdata: umožní získat dříve definovaná data z vybraného objektu value = getappdata(object_handle,name) values = getappdata(object_handle)
6.5.2010 23:54
57/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Návrh jednoduchého programu (#1)
co by měl umět: co chceme ovlivňovat na vstupu: požadované výstupy: použité objekty: callback funkce: uložení identifikátorů: styl programování:
6.5.2010 23:54
58/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Návrh jednoduchého programu (#2)
nákres GUIe, umístění callback funkcí, duplicity? realizace
6.5.2010 23:54
59/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Návrh jednoduchého programu (#3)
oživení test
6.5.2010 23:54
60/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
GUI: Závěrečné shrnutí
Vždy promyslet co má GUI umět a jak. Nákres GUIe!!!
Definice callback funkcí, hlaviček funkcí, vstupů a výstupů.
Budu využívat reference na objekty? Kam je budu ukládat?
GUI by měl být přehledný, bez slepých uliček a chyb.
TVORBA GUIe + oživení
6.5.2010 23:54
61/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Literatura
K.Zaplatílek, B.Doňar: MATLAB - Matlab pro začátečníky K.Zaplatílek, B.Doňar: MATLAB - Tvorba uživatelských aplikací Mathworks: Creating Graphical User Interfaces (dokumentace – pdf) Mathworks: Graphics (dokumentace – pdf) Mathworks: Programming Tips (dokumentace – pdf) P.Marchand, O.T.Holland: Graphics and GUIs with Matlab B.R.Hunt, R.L.Lipsman, J.M.Rosenberg: A Guide to Matlab fórum na www.mathworks.com internet, google
6.5.2010 23:54
62/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Program cvičení, náhradní test
Program cvičení: Vzhledem k volnu ST 12.5. by cvičení někdo měl a někdo ne → cvičení je zrušeno (resp. jeho náplň). Připravené cvičení bude k dipozici na moodlu. Zájemci nechť si prostudují samostatně.
Náhradní test: Všichni, kdo mají nárok (a chtějí) mohou psát náhradní test. Na náhradní, resp. opravné testy se hlašte do KOSu. Podle zaplnění mohou být přidány termíny.
6.5.2010 23:54
63/63
A2B99MAA (12.týden): Tvorba uživatelských aplikací Miloslav Čapek,
[email protected]
Děkuji za pozornost
[email protected]