You are on page 1of 22

Wstp do GUI w Matlabie.

GUI (Graphical User Interface) jest systemem uatwiajcym prac w Matlabie. Umoliwia on uytkownikowi automatyczne wydawanie wielu polece (np. poprzez nacinicie odpowiedniego klawisza), a take uatwia prac osobom, ktre sabo znaj Matlaba i jego komendy. Projektowanie GUI jest take pierwszym krokiem do tworzenia wolno stojcych aplikacji.

W Matlabie do projektowania GUI suy program GUIDE (Graphical User Interface Development Enviroment). Uruchamia si go z Matlaba wpisujc w oknie Command Window komende guide Na ekranie powinno pojawi si nastpujce okno

W celu stworzenia tego GUI wybieramy opcj Blank GUI (Default) i klikamy OK. W nowo otworzonym oknie moemy tworzy ju wygld naszej aplikacji

W centrum (cz zakratkowana) znajduje si obszar wywietlany po uruchomienu aplikacji. Klikajc dwukrotnie w dowolnym miejscu pojawia si okno Property Inspector. (Inne moliwoci uruchomienia to: - kliknicie prawym przyciskiem myszy i z rozwijanego menu wybranie opcji Property Inspector - Z menu View wybranie opcji Property Inspector)

Kady obiekt wprowadzony w GUIDE ma wasnego Property Inspector, w ktrym mona ustawi podstawowe informacje. W przykadzie ustalimy wielko otwieranego okna na 10 X 15 cm. W tym celu zjedamy w d do zakadki Units i wybieramy opcj centimeters

Nastpnie naciskamy + przy zakadce Position i wybieramy zmieniamy width na 15, a height na 10. (Zatwierdzamy przyciskiem Enter)

Nastpnie zamykamy okno Property Inspector. Z lewej strony okna GUIDE znajduje si menu pozwalajce wybra obiekty uywane w GUI. S one bardzo podobno do obiektw uywanych przy projektowaniu stron HTML w JavaScript

S to kolejno - Push Button przycisk (dzwonkowy jego nacinicie powoduje okrelon akcj) - Slider suwak - Radio Button wybr jednej z opcji w grupie - Checkbox - wcznik - Edit Text tekst edytowalny (w trakcie dziaania GUI) - Static Text tekst (nie zmieniany w trakcie dziaania GUI) - Popup Menu lista rozwijana - Listbox - Toggle Button przecznik znajduj si w dwch pooeniach: wcinity bd nie - Axes pole wykresu - Panel ramka (element dekoracyjny, oraz nadrzdny- moe sterowa obiektami lecymi w nim; reagowa na zmiany wewntrz) - Button Group b. podobne do Panelu - ActiveX Control inne funkcje. Np. zegar Windowsowy, etc. Na pocztek wstawmy wykres i przycisk (Push button)

Otwrzmy property inspector wykresu. Przestawmy opcj Units na centymetry, a nastpnie wielko wykresu na 10x6 cm, pozycje x=1, y=3

Dziki temu wykres znajdzie si w prawym grnym rogu punkt (0,0) znajduje si w lewym dolnym rogu. Property inspector wykresu ma kilkadziesit funkcji. Wikszoci z nich waciwie nigdy nie bdziemy uywa. Otwrzmy P. I. przycisku. Najpierw zmiemy waciwo String na rysuj. Dziki temu po wczeniu GUI nasz przycisk bdzie mia t wanie nazw.

Uwaga: Waciwo string moe zawiera polskie znaki np. zmie. Trzeba jednak uwaa przy wprowadzaniu, gdy Matlab przed kadym polskim znakiem dodaje kwadracik (zmie ). Przy wikszej liczbie polskich usuwanie kwadracikw jest do uciliwe. Pojawianie si kwadracikw jest nowym udoskonaleniem pojawiajcym si chyba po raz pierwszy w Matlabie 7.0.4. Sprbujmy teraz wczy nasz rysunek. Moemy to zrobi na 3 sposoby ctrl+t, menu Tools->run, lub zielona strzaeczka w prawym grnym rogu

Matlab zapyta si, czy chcemy zapisa zmiany. Bez zapisania zmian nie da si uruchomi GUI.

Po klikniciu na Yes przechodzimy do domylnego katalogu roboczego. Jeli nic emy nie zmieniali bdzie to C:\Program Files\Matlab704\work. Zapiszmy nasz plik jako pierwszy_guide.fig

Po zapisaniu wygeneruje si nam automatycznie m-file, o tej samej nazwie co plik fig. Wsplnie tworz one informacje dla Matlaba jak ma wyglda GUI. Powinno pokaza si nam co takiego:

Przycisk ju dziaa mona go wciska. Nie powoduje on jednak adnej zmiany.

Dodajmy teraz funkcjonalno tego guzika rysowanie obiektu peaks(12). Najpierw zmiemy waciwo Tag przycisku rysuj z pushbutton1 na rysuj.

Zapiszmy zmiany i przejdmy do m-filu.

Dziki zmianie waciwoci tag, moemy atwo przej do miejsca definiowania funkcjonalnoci naszego przycisku. Tu moe zysk czasu i wygody nie jest jeszcze wielki (mamy, pki co, tylko jeden przycisk), ale przy tworzeniu GUI z kilkoma przyciskami jest to wielka wygoda. Pod funkcj rysuj_Callback dziaajc po wczeniu przycisku, wpisujemy peaks(12); Zapisujemy i uruchamiamy.

Po wciniciu przycisku na wykresie powinien pojawi si rysunek tu uwaga: ustawienie wykresu nie jest przypadkowe. Moemy nim sterowa odpowiednimi waciwociami wykresu w Property inspector. Zwrmy uwag, e wpisanie bez rednika spowoduje wywietlenie wartoci w gwnym oknie matlaba. Tak wic strasznie na okoo udao nam si stworzy, to co moglibymy zrobi sam komend peaks(12); .

Przekazywanie wartoci midzy obiektami

Dodajmy teraz co mdrzejszego. Zrbmy suwak, ktry umoliwia nam ustalenie wartoci dla peaks. Najpierw wstawmy suwak poziomo. Uwaga: - jeli wemiemy z panelu obiekt suwak i wkleimy go na scen, bdzie pionowy. Moemy go nastpnie przeskalowa moemy po wziciu z panelu od razu ustawi wielko suwaka

Ustawmy wielko suwaka na 0.45x10 cm (pamitajmy o zmianie jednostek - Units)

Ustawmy teraz w linii wykres i linijk. Z menu Tools wybierzmy Grid and Rulers

W otwartym oknie zaznaczmy wszystkie obiekty

Teraz z lewego boku moemy wycign lini. Docignijmy j do lewego boku wykresu. Jest to prowadnica, do ktrej moemy ustawia inne obiekty dziaa tak jak np. w Corelu.

Moemy teraz docign suwak do tej linii.

Zmiemy teraz w Property Inspector waciwo Tag linii na suwak. Zmiemy te waciwoci min i max na 2 i 50. Dziki temu warto na tym suwaku bdzie moga przyjmowa wartoci w tym wanie zakresie. Domylnie s to wartoci od 0 do 1. Musimy te zmieni warto Value. Jest to warto, ktr przyjmuje suwak po uruchomieniu GUI. Domylnie jest to 0. Poniewa zero jest poza zakresem wartoci naszego suwaka, musimy go zmieni. Ustawmy najmniejsz moliw warto, tzn. 2.

Przejdmy do m-filu, do funkcji suwak_Callback. Funkcja get(hObject,'Value') zwraca nam aktualn warto suwaka (w formacie double). Chcemy zapamita j i odczyta w momencie wcinicia przycisku rysuj. Wszelkie zapamitywanie wartoci odbywa si przy pomocy funkcji handles. Zapiszmy
handles.suwak=get(hObject,'Value');

Dziki temu w strukturze handles pod nazw suwak bdzie zapisana warto. Nastpnie musimy zapisa (odwiey) struktur handles. Odbywa si to za pomoc komendy
% Update handles structure guidata(hObject, handles);

WSZELKIE ZMIANY WARTOCI ZMIENNYCH MUSZ BY ZAPISYWANE JAKO HANDLES I ODWIEANE KOMEND guidata(hObject, handles); !!!!!!!

Nasz kod powinien wyglda mniej wicej tak

Teraz odczytajmy t warto przy funkcji rysuj_Callback. Odczytanie odbywa si po prostu przez przypisanie zmiennej wartoci handles.suwak. Ograniczmy warto handles.suwak do wartoci cakowitych. Wemy podog z pierwotnej wartoci.
z=floor(handles.suwak);

Zmiemy teraz funkcj tak, aby rysowaa peaks(z); zamiast peaks(12);. Nasz kod powinien wyglda tak:

Uruchommy teraz nasz kod. Przestawiajc suwak, a nastpnie naciskajc przycisk rysuj bdziemy otrzymywa rne wykresy.

Zmienianie waciwoci innych obiektw

W tym momencie przesuwajc suwak moemy tylko mniej wicej domyla si jego wartoci. Nie wiemy dokadnie na jak pozycj emy go przestawili. Dodajmy teraz pole tekstowe, ktre bdzie zawierao warto suwaka. Niech bdzie to Static Text, wstawiony mniej wicej w poowie suwaka.

Zmiemy teraz waciwo Tag na wartoscSuwaka (Tag nie moe zawiera polskich znakw), i usumy wpis we waciwoci String

Przejdmy do m-pliku do funkcji suwak_Callback i dopiszmy tam komend zmieniajca warto pola wartoscSuwaka jeszcze przed zapisaniem zmian do struktury handles.
set(handles.wartoscSuwaka,'String',floor(get(hObject,'Value')));

Przy pomocy funkcji set moemy zmienia wszystkie waciwoci dostpne w Property Inspector. Wystarczy adres obiektu (handles.nazwa), adres waciwoci (w pojedynczym cudzysowie) i warto kocowa. Naley tylko uwaa, czy zgadzaj si formaty (przydatne komendy str2int, oraz int2str), oraz czy dana zmiana nie jest sprzeczna z innymi wasnociami (np. czy zmiana wartoci suwaka mieci si w jego przedziale (min,max), mona prbowa rozwizaniem typu try..... catch.....). W uruchomionym programie, po przesuniciu suwaka (i puszczeniu go), pod suwakiem powinna pojawi si liczba cakowita i to od tej liczby powinien by tworzony wykres peaks.

nazwa_OpeningFcn

Rozwimy teraz pewien bd naszego programu. Po uruchomieniu, jeli nie przesuniemy suwaka, program nie wie, jak warto ma z (lub co na jedno wychodzi handles.suwak). Jeli bez zmiany suwaka naciniemy przycisk rysuj, to albo program zgupieje, albo przypisze jak przypadkow liczb. Zmiemy to. W momencie uruchamiania naszego GUI na samym pocztku program uruchamia funkcj nazwaProgramu_OpeningFcn. Wstawienie tam odpowiednich komend, budowanie odpowiedniej struktury ju na tym poziomie pozwala czsto unikn bdw w programie. Dodajmy w funkcji pierwszy_rysunek_OpeningFcn nastpujcy wiersz
handles.suwak=2;

Dziki temu powinnimy unikn bdu przy uruchamianiu si funkcji. Moemy jeszcze zmieni waciwo String w polu tekstowym wartoscSuwaka na 2. Dziki temu w momencie wczenia programu od pocztku bdziemy widzie warto suwaka.

wiczenia wiczenie 1. Wstaw nowy przycisk (Pushbutton), ktry bdzie pozwala obraca wykres. Nazwij go rotacja i zmie jego waciwo Tag na rotacja. W m-filu ustaw waciwo rotacji.

Podpowied

wiczenie 2. Wstaw Pop-up Menu o wartociach surf, mesh, contour. W zalenoci od wyboru nacinicie na przycisk rysuj ma powodowa rysowanie peaks(z) jako surf, jako mesh, lub jako contour.

Podpowiedzi przykadowego rozwizania 1. Wstaw Pop-up Menu, ktrego wartoci bd surf, mesh i contour zmie Tag (np. na rodzajWykresu) 2. Niech w OpeningFcn bdzie tworzony nowy obiekt struktury handles. Np. handles.rodzaj o pocztkowej wartoci np. surf (najlepiej tej samej co pierwszy obiekt w Pop-up Menu). 3. Dodaj w funkcji Pop-up Menu (np. rodzajWykresu_Callback) odczytanie wyboru. Przyjrzyj si opisowi Hints

Jeli nadal nie wiesz spjrz tutaj 4. Zapisz odczytany wynik do struktury hints, (np. handles.rodzaj) 5. W funkcji przycisku rysuj wstaw odpytanie (if.... else.....) o warto obiektu struktury (np. handles.rodzaj). Pamitaj do porwnywania stringw suy komenda strcmp. W zalenoci od wyniku niech odbywa si mesh(peaks(z)), surf(peaks(z)), contour(peaks(z)); Dokadniejsze rozwizanie na nastpnej stronie

Ad. 1. Aby Pop-up Menu dobrze wygldao kliknij dwa razy w ten symbol przy waciwoci string

W nowym oknie moesz uywa przycisku enter.

Ad. 2. Np. kod


handles.rodzaj='surf';

surf musi by podane jako string. Samo surf (bez cudzysowu) si nie uda! Ad. 3. i 4. Np. kod
val = get(hObject,'Value'); str = get(hObject, 'String'); handles.rodzaj=str{val};

Dziki temu handles.rodzaj bdzie zawiera wybran warto.

Ad. 5. Np. komenda


r=handles.rodzaj if strcmp(r,'mesh') mesh(peaks(z)); elseif strcmp(r,'surf') surf(peaks(z)); else contour(peaks(z)); end;

You might also like