Pakiety numeryczne Graphical User Interface Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania
Tworzenie GUI >> guide
Ustawienia GUI Resize behavior: Non-resizable Proportional Other (Use ResizeFcn)
Funkcje callbacks GUI Poszczególne funkcje są wywoływane w momencie: CreateFcn – tworzenia GUI CloseRequestFcn – próby zamknięcia GUI DeleteFcn – zamykania GUI ResizeFcn – zmiany rozmiarów GUI ButtonDownFcn – wciśnięcia klawisza myszki WindowButtonDownFcn – j.w. WindowButtonUpFcn – zwolnienia klawisza myszki WindowButtonMotionFcn – ruchu myszki nad GUI WindowScrollWheelFcn – obrotu kółkiem myszki KeyPressFcn – wciśnięcia klawisza WindowKeyPressFcn – j.w. KeyReleaseFcn – zwolnienia klawisza WindowKeyReleaseFcn – j.w. Pozostałe funkcje: Callback – akcja odpowiednia do elementu SelectionChangeFcn – zmiana wyboru dla grupy elementów RadioButton CellEditCallback – zmiany wartości komórki w tabeli CellSelectionCallback – wyboru komórki w tabeli
Argumenty każdej funkcji callback hObject – uchwyt do obiektu (u nas do firuge1) eventdata – struktura zawierająca informacje o zdarzeniu towarzyszącym wywołaniu funkcji (zawartość zależna od konkretnej funkcji) handles – struktura zawierająca uchwyty do wszystkich obiektów
GUI1.fig Położenie kursora (współrzędna x) Położenie kursora (współrzędna y) Przyciśnięty klawisz myszki Przyciśnięty klawisz Przyciśnięty klawisz modyfikujący Znak wynikowy Ruch kółkiem myszki
GUI1.m function figure1_WindowButtonMotionFcn(hObject, eventdata, handles) pozycja_myszki=get(hObject,'CurrentPoint'); set(handles.text1,'String',num2str(pozycja_myszki(1))); set(handles.text2,'String',num2str(pozycja_myszki(2))); function figure1_WindowButtonDownFcn(hObject, eventdata, handles) ktory_przycisk=get(hObject,'SelectionType'); if strcmp(ktory_przycisk,'normal') set(handles.text3,'String','LEWY'); elseif strcmp(ktory_przycisk,'extend') set(handles.text3,'String','ŒRODKOWY'); elseif strcmp(ktory_przycisk,'alt') set(handles.text3,'String','PRAWY'); else set(handles.text3,'String','PODWÓJNE'); end Parametr CurrentPoint to dwuelementowy wektor zawierający współrzędne kursora Parametr String zawiera napis Funkcja num2str zamienia liczbę na napis Parametr SelectionType zawiera informację który przycisk myszki został wciśnięty Funkcja strcmp porównuje dwa napisy normallewy extendśrodkowy altprawy openpodwójne kliknięcie
GUI1.m function figure1_WindowButtonUpFcn(hObject, eventdata, handles) set(handles.text3,'String',''); function figure1_WindowKeyPressFcn(hObject, eventdata, handles) set(handles.text4,'String',eventdata.Key); set(handles.text5,'String',eventdata.Modifier); set(handles.text6,'String',eventdata.Character); function figure1_WindowKeyReleaseFcn(hObject, eventdata, handles) set(handles.text4,'String',''); set(handles.text5,'String',''); set(handles.text6,'String',''); function figure1_WindowScrollWheelFcn(hObject, eventdata, handles) if eventdata.VerticalScrollCount>0 set(handles.text7,'String','W DÓ£'); elseif eventdata.VerticalScrollCount<0 set(handles.text7,'String','W GÓRÊ'); end Przyciśnięty klawisz Przyciśnięty klawisz modyfikujący Znak wynikowy Wartość większa od 0 oznacza obrót w dół (zazwyczaj wartość jest równa 1 jednak może być większa) Analogicznie jak powyżej tylko wartość jest ujemna
GUI1 Pliki GUI1.fig oraz GUI1.m są pod adresem: home.agh.edu.pl/~szt/pliki/GUI1.zip
Zakres osi X, długość kroku GUI2.fig Wykres funkcjiWzór funkcji Wykres liniowy albo punktowy Styl linii Kształt markera Grubość linii Wielkość markera Pokaż linie siatki Zakończ program
GUI2.m function axes1_CreateFcn(hObject, ~, ~) x=-1:0.01:1; y=x; h=plot(x,y); set(hObject,'UserData',h); set(gca,'XLim',[-1 1]); function listbox1_CreateFcn(hObject, ~, ~) set(hObject,'String',{'x';'x.^2';'x.^3';'2.^x';'0.5.^x';'sin(x)';... 'cos(x)';'atan(x)';'sinh(x)';'cosh(x)';'exp(x)';'abs(x)'}); set(hObject,'Value',1); function uipanel1_CreateFcn(hObject, ~, ~) set(hObject,'Title','Styl'); function radiobutton1_CreateFcn(hObject, ~, ~) set(hObject,'String','Linia'); set(hObject,'Value',1); function radiobutton2_CreateFcn(hObject, ~, ~) set(hObject,'String','Punkty'); set(hObject,'Value',0); Niewykorzystane argumenty można zastąpić znakiem tylda Parametr UserData jest do naszej dyspozycji. Zapisujemy w nim uchwyt to wykresu Lista będzie zawierać wzory funkcji.
GUI2.m function popupmenu1_CreateFcn(hObject, ~, ~) set(hObject,'String',{'-';':';'-.';'--';'none'}); set(hObject,'Value',1); function popupmenu2_CreateFcn(hObject, ~, ~) set(hObject,'String',{'.';'o';'x';'+';'*';'s';'d';'v';'^';'>';'<';'p';'h';'none'}); set(hObject,'Value',1); set(hObject,'Visible','Off'); function slider1_CreateFcn(hObject, ~, ~) set(hObject,'Min',1); set(hObject,'Max',21); set(hObject,'SliderStep',[ ]); set(hObject,'Value',1); function slider2_CreateFcn(hObject, ~, ~) set(hObject,'Min',1); set(hObject,'Max',30); set(hObject,'SliderStep',[ ]); set(hObject,'Value',5); set(hObject,'Visible','Off'); popupmenu2 ma być niewidoczne Pierwsza składowa SliderStep to procentowa zmiana wartości przy kliknięciu na strzałkę suwaka, druga przy kliknięciu na suwak popupmenu1 i popupmenu2 będą zawierać możliwe style linii i kształty markera
GUI2.m function edit1_CreateFcn(hObject, ~, ~) set(hObject,'String','-1'); function edit2_CreateFcn(hObject, ~, ~) set(hObject,'String','0.01'); function edit3_CreateFcn(hObject, ~, ~) set(hObject,'String','1'); function checkbox1_CreateFcn(hObject, ~, ~) set(hObject,'String','Linie siatki'); set(hObject,'Value',0); function pushbutton1_CreateFcn(hObject, ~, ~) set(hObject,'String','Zamknij');
GUI2.m function listbox1_Callback(hObject, ~, ~) fs=get(hObject,'String'); f=fs{get(hObject,'Value')}; x=get(get(gca,'UserData'),'XData'); y=eval(f); set(get(gca,'UserData'),'YData',y); function popupmenu1_Callback(hObject, ~, ~) ls=get(hObject,'String'); set(get(gca,'UserData'),'LineStyle',ls{get(hObject,'Value')}); function popupmenu2_Callback(hObject, ~, ~) m=get(hObject,'String'); set(get(gca,'UserData'),'Marker',m{get(hObject,'Value')}); function slider1_Callback(hObject, ~, ~) set(get(gca,'UserData'),'LineWidth',get(hObject,'Value')); function slider2_Callback(hObject, ~, ~) set(get(gca,'UserData'),'MarkerSize',get(hObject,'Value')); Odczytujemy wzory wszystkich funkcji Do f zapisujemy wybrany (w postaci napisu) Z wykresy odczytujemy współrzędne x punktów Funkcja eval wykonuje polecenie zawarte w zmiennej f – tam jest wzór funkcji, a w zmiennej x są argumenty Zmieniamy współrzędne y punktów na wykresie Odczytujemy wszystkie style linii Ustawimy aktualnie wybrany Ustawiamy aktualną grubość linii
GUI2.m function uipanel1_SelectionChangeFcn(~, eventdata, handles) if eventdata.NewValue==handles.radiobutton1 set(handles.popupmenu1,'Visible','on'); set(handles.slider2,'Visible','off'); set(handles.popupmenu2,'Visible','off'); popupmenu1_Callback(handles.popupmenu1); set(get(gca,'UserData'),'Marker','none'); else set(handles.slider2,'Visible','on'); set(handles.popupmenu2,'Visible','on'); set(handles.popupmenu1,'Visible','off'); set(get(gca,'UserData'),'LineStyle','none'); popupmenu2_Callback(handles.popupmenu2); end function checkbox1_Callback(hObject, ~, ~) if get(hObject,'Value') grid on; else grid off; end Jeżeli wybierzemy wykres liniowy Ukrywamy/pokazujemy odpowiednie elementy GUI Uaktualniamy styl linii poprze „ręczne” wywołanie funkcji Callback dla popupmenu1 Usuwamy markery – zostaje sama linia Jeżeli wybierzemy wykres punktowy postępujemy analogicznie Dla wartości 1 pokazujemy linie siatki, dla zero chowamy.
GUI2.m function edit1_Callback(~, ~, handles) zmiana_zakresu(handles); function edit2_Callback(~, ~, handles) zmiana_zakresu(handles); function edit3_Callback(~, ~, handles) zmiana_zakresu(handles); function zmiana_zakresu(handles) a=str2double(get(handles.edit1,'String')); k=str2double(get(handles.edit2,'String')); b=str2double(get(handles.edit3,'String')); fs=get(handles.listbox1,'String'); f=fs{get(handles.listbox1,'Value')}; x=a:k:b; y=eval(f); set(get(gca,'UserData'),'XData',x); set(get(gca,'UserData'),'YData',y); set(gca,'XLim',[a b]); function pushbutton1_Callback(~, ~, ~) close(GUI2); Zmiana zakresu lub długości kroku wywołuje funkcję zmiana_zakresu Odczyt nowych wartości Odczyt aktualnego wzoru funkcji Generujemy wektor x Obliczamy wektor y Zmieniamy wykres Wciśnięcie przycisku zamyka program
GUI2 Pliki GUI2.fig oraz GUI2.m są pod adresem: home.agh.edu.pl/~szt/pliki/GUI2.zip
Prezentacja udostępniona na licencji Creative Commons: Uznanie autorstwa, Na tych samych warunkach 3.0. Pewne prawa zastrzeżone na rzecz autorów. Zezwala się na dowolne wykorzystywanie treści pod warunkiem wskazania autorów jako właścicieli praw do prezentacji oraz zachowania niniejszej informacji licencyjnej tak długo, jak tylko na utwory zależne będzie udzielana taka sama licencja. Tekst licencji dostępny jest na stronie: