WxPython jest platformą pozwalającą tworzyd aplikacje okienkowe nie tylko dla systemu Windows ale i Mac czy Unix. Instalujemy: 1. Ze strony: http://www.wxpython.org/download.php#stable wybieramy odpowiednią wersję dla swojego systemu operacyjnego i wersji Pythona. Instalacja WxPython dla Windows http://www.wxpython.org/download.php 2. Używamy wxpythona przez importowanie tej biblioteki w każdym kodzie źródłowym pytona: Ale od początku:
wxpython składa się z 5 podstawowych modułów: Moduł Controls dostarcza wzorców podstawowych komponentów przy tworzeniu aplikacji (tzw. widgetów) np.: button, toolbar, notebook. Nazywamy je popularnie kontrolkami. Moduł Core dostarcza podstawowych klas: Object (matka wszystkich klas), Sizers (layouty widgetów), Events (zdarzenia), oraz klasy elementarnej grafiki jak Prostokąty (Rectangle) czy punkt (Point). GDI (graphics device interface) to zbiór klas pozwalających rysowad na widgetach. Mamy to klasy do manipulacji czcionkami (Font), kolorami (Colours), Brushes, Pens i Images (pędzel, czy obrazy). Misc to zbiór różnego typu klas i funkcji np. do logowania, konfiguracji aplikacji, ustawieo systemowych, wyświetlaniem czy sterowaniem aplikacją. Windows to grupa klas do tworzenia okna: formatek, okien czy całej aplikacji: Scrolled Window, Dialog, Panel czy Frame. Podstawowe Widgety: Widgety górnego poziomu (występuję zależnie od siebie): Kontenery (zawierające inne widgety): Dynamiczne widgety: Statyczne widgety:
Inne: Dziedziczenie: Każde okno może reagowad na zdarzenia a więc Button także. Klikając na przycisk (button) wywołujemy zdarzenie: wx.evt_command_button_clicked Aby widget mógł reagowad na zdarzenia musi dziedziczyd własności po klasie wx.evthandler. Krok 1. Pierwszy program Efektem kodu: Będzie okno: Interpretacja kodu: Linia 1: import wx znaczenie: importujemy pakiet WxPython Linia 2: app = wx.app() znaczenie: każdy obiekt wxpython musi mied przynajmniej jeden obiekt typu App
Linia 3: frame = wx.frame(none, -1, 'simple.py') znaczenie: obiekty typu wx.frame to typ kontenera, ponieważ nie ma nadrzędnego sobie kontenera bo jest głównym kontenerem aplikacji to wpisujemy None w miejscu odwołania do rodzica. Trzeci argument simple.py oznacza, że w tytule okienka będzie taki wlasnie napis. Linia 4: frame.show() znaczenie: musimy pokazad okno na ekranie Linia 5: app.mainloop() znaczenie: wyświetlanie dzieje się w pętli, dopóki innym zdarzeniem nie przerwiemy wyświetlania okna. Wx.Frame jest typem kontenera który nie zawiera ramek (Frame) czy dialogów (Dialog). Sklada się z paska tytułu, obszarów bocznych i środkowego do umieszczania komponentów. Konstruktor klasy dla wx.frame: Wx.DEFAULT_FRAME_STYLE to zbiór możliwych stylów okna: Wx.MINIMIZE_BOX, wx_maximize_box, wx_resize_border, wx_system_menu, wx.caption, wx_close_box, wx_clip_children. Krok 1a. Mała zmiana Wykonanie kodu: Praktycznie niczym się nie różni, chod w szczegółach się okaże, że nie można tego okna zminimalizowad. Krok 2. Ustalimy teraz rozmiar wyświetlanego okna. Wykonanie kodu: Spowoduje powstanie okna o rozmiarach: 250 x 200 pikseli.
Możemy także sterowad pozycją w której okno będzie wyświetlone na ekranie: Np. kod: Wyświetli okno (lewy górny róg okna) w pozycji 800 x 250. Zaś kod: Wyświetli okno dokładnie na środku ekranu. Krok 3: Komunikacja z użytkownikiem. Napiszemy aplikację która tworzy okienko z dwoma przyciskami (button) i polem tekstowym w którym wyświetlana jest aktualna wartośd licznika, którego możemy zmniejszad bądź zwiększad klikając na przyciski + i -.
Kod: import wx class LeftPanel(wx.Panel): def init (self, parent, id): wx.panel. init (self, parent, id, style=wx.border_sunken) self.text = wx.statictext(self, -1, '0', (140, 60)) button1 = wx.button(self, -1, '+', (10, 10)) button2 = wx.button(self, -1, '-', (10, 60)) self.bind(wx.evt_button, self.onplus, id=button1.getid()) self.bind(wx.evt_button, self.onminus, id=button2.getid()) def OnPlus(self, event): value = int(self.text.getlabel()) value = value + 1 self.text.setlabel(str(value)) def OnMinus(self, event): value = int(self.text.getlabel()) value = value - 1 self.text.setlabel(str(value)) class Communicate(wx.Frame): def init (self, parent, id, title): wx.frame. init (self, parent, id, title, size=(280, 200)) panel = wx.panel(self, -1) leftpanel = LeftPanel(panel, -1) hbox = wx.boxsizer() hbox.add(leftpanel, 1, wx.expand wx.all, 2) panel.setsizer(hbox) self.centre() self.show(true) app = wx.app() Communicate(None, -1, 'licznik') app.mainloop() Ćwiczenia: Spróbuj dodać jeszcze jeden przycisk, który będzie zerował wartość licznika.
Krok 4. Tworzenie Menu Aby dodad menu do naszej aplikacji potrzebujemy 3 elementów: 1. wx.menubar 2. wx.menuitem 3. wx.menu Wykonanie następującego kodu: Kod: import wx class SimpleMenu(wx.Frame): def init (self, parent, id, title): wx.frame. init (self, parent, id, title, size=(250, 150)) menubar = wx.menubar() file = wx.menu() file.append(-1, 'koniec', 'koniec programu') menubar.append(file, '&Plik') self.setmenubar(menubar) self.centre() self.show(true) app = wx.app() SimpleMenu(None, -1, 'proste menu') app.mainloop() To okno: Gdzie póki co nic się nie dzieje. Jeśli chcemy utworzyd cały pasek:
Wystarczy napisad następujący kod: Krok 5: obsługa zdarzeo Aby napisad taki program wystarczy użyd kodu: import wx class MenuExample(wx.Frame): def init (self, parent, id, title): wx.frame. init (self, parent, id, title, size=(250, 150)) menubar = wx.menubar() file = wx.menu() quit = wx.menuitem(file, 1, '&Quit\tCtrl+Q') quit.setbitmap(wx.bitmap('icons/exit.png')) file.appenditem(quit) self.bind(wx.evt_menu, self.onquit, id=1) menubar.append(file, '&File') self.setmenubar(menubar) self.centre() self.show(true) def OnQuit(self, event): self.close() app = wx.app() MenuExample(None, -1, '') app.mainloop() Klikając opcję Quit wywołujemy zdarzenie: wx.evt_menu, i wywołujemy metodę o nazwie onquit() która zamyka aplikację:
Każda taka opcja w menu (MenuItem) może byd elementem typu: normal item radio item check item np.: self.shst = view.append(id_stat, 'Show statubar', 'Show Statusbar', kind=wx.item_check) Potem sprawdzenie czy opcja jest włączona czy wyłączona def ToggleStatusBar(self, event): if self.shst.ischecked(): self.statusbar.show() else: self.statusbar.hide() Toolbar CreateToolBar(long style=-1, int winid=-1, String name=toolbarnamestr) Krok 6: tworzymy aplikację z menutoolbarem z dwoma przyciskami (2 obrazki): Czego efekt będzie następujący: Krok 7: okno dialogowe. Wykonaniem następującego kodu:
Będzie aplikacja: Klikając w przycisk: uruchomi się okno: Wybierając opcję Tak zamykamy aplikację, wybierając Nie wracamy do aplikacji. Krok 8: Okno dialogowe częśd II Czasami chcemy sprawdzid jakie zdarzenia kliknięto X do zamknięcia okienka i zapobiec temu. Chcemy np. zapytad użytkownika wtedy czy na pewno chce zamknąd okno czy jednak nie. Służą do tego okienka dialogowe. Gdy pojawi się okno: I klikniemy: wyświetli się okno z pytaniem
Jeśli teraz klinkiemy Tak program się zakooczy (okno się zamknie). Jeśli klikniemy Nie wrócimy do głównego okna. Kod programu który to realizuje wygląda następująco: Linia nr 5: Tutaj mówimy, iż okno główne ma mied obsługę zdarzeo na zamknięcie okna i wtedy jeśli przechwycone zostanie takie zdarzenie ma zostad wykonana funkcja OnClose(). Jej ciało (a więc instrukcje, które mają się wykonad gdy to zdarzenie nastąpi) wygląda następująco: A wiec tworzymy obiekt o nazwie dial. Będzie on oknem typu MessageDialog, z pytaniem w środku okna Jesteś pewien?, z tytułem Pytanie i możliwymi przyciskami: Tak i Nie. Jest tu także zaznaczone, że domyślnie ma byd zaznaczona opcja Nie i że ma byd w takim okienku inkona pytajnika. Aby nie można było się przełączyd na okienko głowne zanim się nie dokona jakiegoś wyboru należy użyd funkcji ShowModal(). Jeśli użyjemy instrukcji: ret = dial.showmodal() to potem będziemy mogli sprawdzid która opcja tak czy nie została wybrana przez użytkownika za pomocą następującego kodu: if ret == wx.id_yes: else: self.destroy() event.veto() To jest równoważne z zapisem:
if ret == wx.id_yes: self.destroy() elif ret == wx.id_no: event.veto() Krok 9: Zdarzenia w pythonie Napiszmy aplikację która tworzy okienko i sprawdza pozycję startową okienka, którego lokalizację zmieniamy przeciągając myszą okno z pozycji A do pozycji B. Za każdym razem zostanie wówczas odczytana aktualna pozycja lewego górnego okna programu i wyświetlona na ekranie wartości pozycji na osi X i Y. Aby sprawdzid zmianę lokalizacji komponentu użyjemy zdarzenia wx.moveevent i konkretnie klasy wx.evt_move. Komendą którą zwiążemy jakiś komponent z obsługą zdarzeo i pokażemy funkcję która ma byd wywołana gdy to zdarzenie nastąpi będzie: self.bind(wx.evt_move, self.onmove) Teraz musimy jeszcze wskazad co ma się stad w ciele funkcji OnMove(): def OnMove(self, event): x, y = event.getposition() Efekt: Gdy teraz przesuniemy okno w inne miejsce. Krok 10: Obsługa klawiatury:
Reakcja tylko na określony klawisz jest możliwa w pytonie w prosty sposób: 1. Najpierw pobieramy kod klawisza: keycode = event.getkeycode() 2. Sprawdzamy czy klawisz to ten o który nam chodzilo: if keycode == wx.wxk_escape: Jak widad sprawdzenie czy wciśnięto klawisz ESCAPE wykonane jest w następujący sposób: Gdybyśmy teraz chcieli sprawdzid i cos innego zrobid gdy z klawiatury użytkownik wciśnie klawisz np. A lub a wystarczy dodad fragment kodu: Krok 11: Message Dialogi
To pozwala stworzyd aplikację: Gdzie klikając na każdy z przycisków: info, error, question czy alert dostajemy inne okienka z komunikatami: Dla info: Dla error : Dla question : I dla alert :
Flaga wx.ok wx.cancel wx.yes_no wx.yes_default wx.no_default wx.icon_exclamation wx.icon_error wx.icon_hand wx.icon_information wx.icon_question znaczenie Show OK. button show Cancel button show Yes, No buttons make Yes button the default make No button the default show an alert icon show an error icon same as wx.icon_error show an info icon show a question icon