bevezetés a wxpythonba

Upload: erik

Post on 07-Jan-2016

231 views

Category:

Documents


0 download

DESCRIPTION

Bevezetés a WxPythonba

TRANSCRIPT

  • Bevezets a wxPythonba

    Jeremy Berthet & Gilles DogeHEIG-VD, 2006. jlius 7.

  • Bevezets a wxPythonba

    Ezt a dokumentumot Jeremy Berthet s Gilles Doge hozta ltre Creative Commons licenc alatt. Fordtotta : Darczy Pter

    n szabadon :

    msolhatja, terjesztheti, eladhatja

    mdosthatja ezt az rst a kvetkez felttelekkel:

    Nevezd meg!. A szerz vagy a jogosult ltal meghatrozott mdon fel kell tntetned a mhz kapcsold informcikat (pl. a szerz nevt vagy lnevt, a M cmt).

    Ne add el!. Ezt a mvet nem hasznlhatod fel kereskedelmi clokra.

    gy add tovbb!. Ha megvltoztatod, talaktod, feldolgozod ezt a mvet, az gy ltrejtt alkotst csak a jelenlegivel megegyez licenc alatt terjesztheted.

    Brmilyen felhasznls vagy terjeszts esetn egyrtelmen jelezned kell msok fel ezen m licencfeltteleit.

    A szerzi jogok tulajdonosnak rsos engedlyvel brmelyik fenti feltteltl eltrhetsz.

    A http://creativecommons.org/licenses/by-nc-sa/2.0/fr/legalcode webhelyen olvashat a licenc teljes szvege; a 8. fejezet f bekezdse a kvetkez kppen mdosul : Az alkalmazand trvnyek a svjci trvnyek.

    Copyright 2006 Jeremy Berthet & Gilles Doge 2 / 62

  • Bevezets a wxPythonba

    Tartalomjegyzk1. Bevezets..........................................................................................................................................6

    1.1. ltalnos bemutats.......................................................................................................................6

    2. Telepts............................................................................................................................................7

    2.1. Linux/Unix....................................................................................................................................7

    2.2. Windows........................................................................................................................................7

    2.3. MacOS 9 s MacOS X..................................................................................................................7

    3. Alapfogsok......................................................................................................................................8

    3.1. Hello World !.................................................................................................................................8

    3.2. A wx.App class..............................................................................................................................9

    3.3. Widget / kd kapcsolat................................................................................................................10

    3.4. Widget-ek kzs tulajdonsgai....................................................................................................11

    4. Ablakozs.......................................................................................................................................13

    4.2. Kilps az alkalmazsbl............................................................................................................13

    4.3. Pozcionls.................................................................................................................................13

    4.3.1. Abszolt pozcionls...............................................................................................................13

    4.4. Sizer-ek........................................................................................................................................14

    4.4.1. Pozcionls sizer-ek segtsgvel............................................................................................14

    4.4.2. Widget-ek hozzkapcsolsa a sizer-hez....................................................................................15

    4.4.3. Widget-ek trlse a sizer-bl....................................................................................................15

    4.5. A Grid Sizer.................................................................................................................................16

    4.6. A Flex Grid Sizer.........................................................................................................................16

    4.7. A Grid Bag Sizer..........................................................................................................................17

    4.7.1. Egy widget hozzkapcsolsa a wx.GridBagSizer-hez..............................................................17

    4.8. Box Sizer.....................................................................................................................................18

    4.9. A Static Box Sizer........................................................................................................................18

    4.10. Prbeszddobozok (dialogbox-ok)............................................................................................18

    4.10.1. Prbeszddoboz egy egyszer zenettel.................................................................................18

    4.10.2. Prbeszddoboz adatberssal................................................................................................19

    Copyright Hungarian Translation 2008 Darczy Pter 3 / 62

  • Bevezets a wxPythonba

    4.10.3. Prbeszddoboz egyszeres kivlasztssal...............................................................................19

    4.10.4. Prbeszddoboz tbbszrs kivlasztssal.............................................................................20

    4.10.5. Egyb prbeszddobozok.......................................................................................................20

    5. A fkusz kezelse...........................................................................................................................21

    5.1. Fkuszesemnyek........................................................................................................................21

    5.2. Manulis fkusz...........................................................................................................................21

    5.3. Fkusz letiltsa............................................................................................................................21

    5.4. Navigci tabultorral.................................................................................................................21

    5.5. Mnemonikus billentyk...............................................................................................................22

    6. Fwidget-ek....................................................................................................................................24

    6.1. wx.StaticText...............................................................................................................................24

    6.2. wx.TextCtrl..................................................................................................................................24

    6.3. wx.Button....................................................................................................................................25

    6.4. wx.ListBox..................................................................................................................................26

    6.5. wx.RadioBox/wx.CheckListBox.................................................................................................27

    7. Grafikus elemek manipullsa.......................................................................................................30

    7.1. Hogyan tltnk be egy kpet.......................................................................................................30

    7.2. Kpmanipulci...........................................................................................................................31

    8. Menk.............................................................................................................................................32

    8.1. Mensv ltrehozsa...................................................................................................................32

    8.2. Menk ltrehozsa.......................................................................................................................32

    8.3. Egy men hozzkapcsolsa/trlse a mensorhoz/bl................................................................33

    8.4. Menpontok hozzadsa a menhz...........................................................................................33

    8.5. Menesemny kezelse...............................................................................................................34

    8.6. Gyorstbillentk (short cut) s mnemonikus hozzfrs...........................................................34

    8.7. Almenk......................................................................................................................................35

    9. Kvetkeztets.................................................................................................................................36

    10. Bibliogrfia...................................................................................................................................37

    11. A pldk forrskdja.....................................................................................................................38

    11.1. Hello World (hello.py)...............................................................................................................38

    Copyright 2006 Jeremy Berthet & Gilles Doge 4 / 62

  • Bevezets a wxPythonba

    11.2. Plda egyszer esemny kezelsre (goodbye.py)....................................................................39

    11.3. Dialogbox-ok (dialog.py)..........................................................................................................40

    11.4. Plda a GridSizer hasznlatra (gridsizer.py)............................................................................43

    11.5. Plda a FlexGridSizer hasznlatra (flexgridsizer.py)...............................................................44

    11.6. Plda a GridBagSizer hasznlatra (gridbagsizer.py)................................................................46

    11.7. Plda a BoxSizer hasznlatra (boxsizer.py).............................................................................48

    11.8. Plda a StaticBoxSizer hasznlatra (staticboxsizer.py)...........................................................50

    11.9. Alkalmazsi plda (gestion_liste.py).........................................................................................51

    11.10. Rdigombos s jellngyzetes plda (radio_check.py).......................................................55

    11.11. Plda kpek alakalmazsra (images.py).................................................................................57

    11.12. Plda menk hasznlatra (menus.py).....................................................................................59

    12. Fggelkek...................................................................................................................................61

    12.1. A. fggelk: A wxPython s a PyQt sszehasonltsa...............................................................61

    12.2. Python script OpenOffice 2 -hz...............................................................................................62

    Copyright Hungarian Translation 2008 Darczy Pter 5 / 62

  • Bevezets a wxPythonba

    1. Bevezets

    A dokumentumot, amit az olvas a kezben tart, eredetileg a HEIG-VD-ben (Haute Ecole d'Ingnierie et de Gestion du Canton de Vaud) egy egy trimeszteres projekt keretben rtk.

    A projekt clja a wxPython knyvtr bemutatsa annak mkdse, valamint az ltala nyjtott funkcik lersa rvn.

    Az elkpzels szerint ezt a dokumentumot egy olyan az elsajttott fogalmak bemutatsra Python-t s wxPython-t alkalmaz user interface kurzusnak kellene kvetni, mint amilyet a HEIG-VD-ben az "Informatika Programozs" szakirny 2. vben tartanak.

    1.1. ltalnos bemutats

    A wxPython API lehetv teszi alap s fejlett felhasznli interface-ek ksztst. Klnbz objektumokat knl a felhasznlnak, amikkel egy modern alkalmazsban vrhatan tallkozunk : ktdimenzis rajzolsi lehetsget, s az MDI (Multiple Document Interface) tpus interface-ek tmogatst.

    A wxPython egy egyszer alkalmazi API, amit arra terveztek, hogy a Python nyelvvel hasznljk. Egy msik API, a wxWidgets, adaptcijrl van sz, amit eredetileg a C++ nyelvhez terveztek.

    Ennek az a kvetkezmnye, hogy a kt API szerkezete (a class-ok hierarchija, a metdusok nevei, stb.) majdnem pontosan megegyez s az, hogy egyszeren hivatkozni lehet a wxWidgets nagyszmban fellelhet dokumentcijra.

    Copyright 2006 Jeremy Berthet & Gilles Doge 6 / 62

  • Bevezets a wxPythonba

    2. Telepts

    2.1. Linux/Unix

    A Linux disztribcik tbbsghez lteznek package-ek, amik mindent elvgeznek a felhasznl helyett. RPM-ek letlthetk a wxPython weboldalrl s a libwxgtkX.Y-python csomagok benne vannak a Debian depban (X s Y a verziszmok).

    Egybknt a wxPython fgg a glib s a gtk+ knyvtraktl, amik alaprtelmezetten teleptve vannak egy GNOME krnyezetben.

    2.2. Windows

    A wxPython site -on a Python 2.3, 2.4, 2.5-hz megtallhatk a wxPython knyvtr telept programjainak Unicode illetve ANSI verzii.

    2.3. MacOS 9 s MacOS X

    A MacOS X 10.3 (Panther) ta (a Python 2.3 -tl kezdve) a wxPython knyvtr alaprtelmezetten teleptve van, gy semmilyen klnnleges teleptst nem ignyel. A wxPython script-et a pythonw interpreterrel kell indtani eltren egy norml Python-programtl. Amennyiben egy korbbi MacOS verzija van, gy a wxPython-t kls csomagokbl kell telepteni.

    Copyright Hungarian Translation 2008 Darczy Pter 7 / 62

  • Bevezets a wxPythonba

    3. Alapfogsok

    3.1. Hello World !

    A tanuls ltalban a lehet legegyszerbb pldval kezddik. Mi sem fogunk kivtelt tenni e szably all. Meg lehet nyitni az ltalunk preferlt szvegszerkesztvel a "hello.py" nev els pldaprogramot s vgre lehet hajtatni.

    A kvetkez brhoz hasonl kpet kell kapnunk (az alkalmazott opercis rendszertl fggen lehetnek kisebb eltrsek).

    Ha a program nem hajtdik vgre, akkor nzzk meg a telepts rendszernkre vonatkoz fejezett s nzzk meg a dokumentcit.

    Megllapthatjuk, hogy nem volt szksg sok kdsorra. Radsul az els pldnkat tl struktrltuk, amikor kt class-ba osztottuk szt a kdot, ami nem felttlenl szksges.

    Elemezznk nhny fontos sort :

    importwx

    Minden wxPython alkalmazsban legalbb ez az import utasts szerepelni fog. Arrl van sz, hogy a modulbeli class-okat importljuk az alkalmazsunkba azzal a cllal, hogy hasznlhassuk ket.

    A MainWindow class a wx.Frame alapclass leszrmazottja, mely utbbi egy ablakot reprezentl a kpernyn. A class konstruktora a szlclass-a konstruktort hvja paramterekkel, amik kzl egyeseknek az rtelmt mr bizonyra kitallta az olvas.

    self.Show(True)

    A Show metdust a wx.Frame -tl rklte s ez teszi lehetv, hogy megmondjuk az ablaknak, hogy a megadott paramternek megfelelen kirdjon-e vagy sem.

    A wxPython a specilis wx.App class-t (valjban tbb is rendelkezsre ll) hasznlja az alkalmazs egyttesnek a definilsra. Ez a 'becsomagols' lehetv teszi a grafikus interface-ek bizonyos specilis konstrukciinak egyszerbb kezelst.

    Copyright 2006 Jeremy Berthet & Gilles Doge 8 / 62

    bra 1: Hello World !

  • Bevezets a wxPythonba

    Pldnkban a MainApp class ebbl szrmazik s ltrehozza a fablakunkat reprezentl objektumot. wxPython-specifikus szervezsi okokbl a konstruktor helyett az OnInit metdust kell tdefinilni. Ez a metdus ltrehozza az ablakunk egy pldnyt s kiratja az eltrben.

    Vgl : az alkalmazs-objektumunk csak abban az esetben jn ltre, ha ez a script a fprogram. A MainLoop hvst az esemnykezelsre vonatkoz rszben fogom elmagyarzni.

    3.2. A wx.App class

    Az elz alfejezetben egy olyan programot lttunk, amit kt class-bl hoztunk ltre. Ez a kt class nem vletlenl van. Az App s a Frame class-ok minden wxPython alkalmazsnak alapelemei, melyekbl a program tbbi rsze szrmazik.

    Br kzvetlenl ebbl a kt osztlybl ltrehozhatk objektumok, a gyakorlat azt ignyli, hogy mindegyik objektumot gy szrmaztassuk le, ahogyan azt az els programpldnkban tettk. A Frame class-t a 6. fejezetben fogjuk rszletesen lerni. Most az App class-t fejtjk ki rszletesebben.

    Egy wxPython alkalmazsban lennie kell egy (s kizrlag csak egy) App objektumnak, mg mieltt a legcseklyebb grafikus komponens pldnyt (a priori a fablakot) ltrehozzuk. Lnyegben ez a klnleges objektum hat kzvetlenl klcsn a rendszerrel s ez az az objektum, ami elkszti a terepet a grafikus objektumaink ltrehozsa szmra.

    Azrt nem tancsos j konstruktort definilni az App class-bl leszrmaztatott class-ok szmra, mert azt kockztatjuk, hogy azzal megzavarjuk a class-ok bels mkdst. Ez az oka annak, hogy az App class-nak van egy OnInit() metdusa, aminek a hvsra az objektum ltrehozsakor automatikusan sor kerl.

    Azrt, hogy biztosak legynk benne, hogy nem hozunk ltre grafikus komponenst azeltt, hogy egy App objektumot generlunk, azt a szokst fogjuk flvenni, hogy az ablak-objektumokat az OnInit() metdusban hozzuk ltre. Innen van az rtelme annak, hogy mindig ltrehozunk egy App subclass-t, mg akkor is, ha a subclass nem terjeszti ki szl-class funkciit.

    Azon tl, hogy a rendszert felkszti grafikus komponens ltrehozsra, az App objektumnak van egy esemnykezelje, ami a MainLoop() metdus hvsakor indul el. Alapjban vve az esemnykezel egy vgtelen ciklus, ami kt dolgot mvel.

    Elszr is az opercis rendszer fell jv jelekre vr (pldul egy egr-klikkelsre), majd amikor egy ilyen jelet fogadott, ezt klnbz paramterekkel (az esemny tpusa, az esemny forrsa, stb.) hozzadja egy vrakozsi sorhoz.

    Utna peridikusan kivesz egy esemnyt a vrakozsi sorbl, majd hvja az ltala olvashat paramtereknek megfelelen kapcsolt metdust. Ha semmilyen metdus sincs kapcsolva, akkor elfelejti az esemnyt s a kvetkezt veszi ki a vrakozsi sorbl.

    Ezrt amit a programoznak meg kell tenni az az, hogy hozz kell kapcsolni egy metdust egy esemnyhez, amint azt a kvetkez alfejezetben ltni fogjuk.

    Az App class mg szmos dolgot lehetv tesz, amik lersa meghaladja ennek a jegyzetnek a kereteit. Tovbbi informcikat a "wxPython in action" cm knyvbl lehet szerezni.

    Vgl jegyezzk meg, hogy az esemnykezel - jl lehet azt mondjuk, hogy egy vgtelen

    Copyright Hungarian Translation 2008 Darczy Pter 9 / 62

  • Bevezets a wxPythonba

    ciklus - megszakad, ha a programban nincs tbb Frame-objektum. Kvetkezsknt az App objektum megsemmisl s nem tudunk tbb grafikus komponenst generlni azeltt, hogy egy App objektumot jra ltrehoznnk.

    3.3. Widget / kd kapcsolat

    Amikor "valami trtnik egy Python-objektummal", akkor egy esemny generldik. Ennek a "valaminek" a termszete igen eltr lehet. Ltrehozhatja a felhasznl pldul egy egrgombbal val kattintssal, vagy kzvetlenl generlhatja egy objektum, amikor megvltoztatta az llapott.

    Lttuk, hogy az esemnyeket, ha mr egyszer ltrejttek, egy esemnykezel fogja el s az amit tennnk kellett, az az volt, hogy hozzjuk kellett kapcsolnunk azokat az akcikat, amiket akkor kell vgrehajtani, amikor az esemnykezel egy meghatrozott esemnyt detektl. A goodbye.py program egy rvid plda a megvalstsra.

    Most nem idznk el egy Panel s egy nyomgom generlsnl ezt ksbb fogjuk lerni -, hanem nzzk meg a Bind() kulcsmetdust.

    Ez a metdus az EvtHandler class-ban van definilva, amibl szmos class van leszrmaztatva (nevezetesen a Frame s a Menu class-ok, valamint az App class, amit mr bizonyra kitallt az olvas). Ez lehetv teszi, a kapcsolatteremtst egy esemnytpus, egy lthat metdus s egy lthat widget kztt. Lthat a kd lthatsgnak rtelmben, nem pedig abban az rtelemben, hogy az objektum ki van-e ratva vagy sem a kpernyre.

    self.Bind(wx.EVT_BUTTON,self.OnClick,self.button)

    A wx.EVT_BUTTON egyike a rendelkezsnkre ll, a bekvetkezhet esemnyeket reprezentl, nagyszm konstansnak. Az elbbi konstans egy egrkattintst reprezentl a frame egyik gombjn (ez az oka annak, hogy a frame Bind() metdust hvjuk). A wxPython on-line dokumentcijban az Event class s subclass-ainak tanulmnyozsa sorn a klnbz widget-ekhez megtalljuk az esemnyek listjt.

    Ebben az illusztratv pldban van egy OnClick() metdusunk a MainWindow class-ban, ami az alkalmazsban a Close() fggvny (amit ksbb fogunk elmagyarzni) segtsgvel trtn bezrst ignyli.

    Ennek a metdusnak brmilyen neve lehet, pldul ClickOnButton().A metdusnak kell, hogy legyen egy paramtere, ami az esemnyobjektumot fogja tartalmazni.

    Egy class-metdus esetben ennek a paramternek a msodiknak kell lenni (tekintettel arra, hogy az els paramter a self) vagy az elsnek kell lenni, ha egy "statikus" fggvnyrl van sz. Ezt a paramtert hagyomnyosan event -nek fogjuk nevezni.

    defOnClick(self,event)

    Jegyezzk meg, hogy egy msik metdus paramtereknt az OnClick() metdus egy pldnyt adjuk t, teht nem kell kitenni a zrjeleket !

    Vgl az utols paramter a kapcsoland esemny forrsobjektumnak azon pldnya, melyet

    Copyright 2006 Jeremy Berthet & Gilles Doge 10 / 62

  • Bevezets a wxPythonba

    akkor kell kapcsolni, ha a Bind() hvsa nem a kzvetlenl az esemnyt kivlt objektumon trtnik, mint ebben az esetben. (Az EVT_BUTTON esemny a frame-tl ered, de nem adja meg, hogy melyik gombon trtnt a kattints.)

    me, ezzel az egyetlen sorral sszekapcsoltunk egy metdust, ami befejezi a programot, egy megadott egrgombbal trtn kattintssal. Ez az eljrs minden olyan objektumra ltalnosthat, aminek lehetnek kapcsolhat esemnyei.

    A Bind() a forrsobjektum helyett elfogadhat kt paramtert - id1 s id2 is. Ez lehetv teszi, hogy ugyanazt az esemnyt hozzrendeljk egy olyan objektumcsoporthoz, mely objektumait egymsutn kvetkez id-k azonostjk. A Bind() metdust ennek ellenre ritkn hvjuk ilyen mdon. ltalban preferland az id-k hasznlatnak kerlse. (A wxPython-ban minden objektumnak van egy id nev tulajdonsga, ami egy egyedi szmrtk.)

    Vgl : a forrsparamter (s az id1, id2 paramterek) opcionlisak. A sajt felelssgre alkalmazza a programoz !

    3.4. Widget-ek kzs tulajdonsgai

    A wxPython-ban minden megjelenthet objektum egy szlosztlybl, a wx.Window -bl van leszrmaztatva.

    Ennek az osztlynak a konstruktora a kvetkez alak :

    wx.Window(self, parent, id=-1, pos=DefaultPosition, size=DefaultSize, style=0, name=PanelNameStr)

    ,ami lehetv teszi minden megjelenthet objektum szmra kzs tulajdonsgok definilst.

    A parent paramter. amint azt a neve is jelzi, az ltalunk ltrehozott objektum szlobjektumt definilja. Ez lehetv teszi egy objektum-hierarchia megrzst, mely hierarchiban az egyik objektum tartalmazza a msikat.

    Ha megint elvesszk az elz kdot, lthatjuk, hogy az ablak (wx.Frame) tartalmaz egy kontnerobjektumot (a wx.Panelt -t, aminek a wx.Frame a szlje), ez utbbi pedig egy gombot tartalmaz.

    Nyilvn val, hogy a kvetkez metdusokkal lehetsg van az gy ltrehozott fban val mozgsra :

    GetParent()

    Ez a metdus teszi lehetv a szlobjektumra val hivatkozst.

    GetChildren()

    Ezzel a metdussal az objektum gyermekobjektumainak hivatkozsait tartalmaz listt kapjuk meg. Lnyeges, hogy tudjuk : ez a lista msolata a wxPython ltal ltrehozott listnak, teht egy j gyermekobjektum ltrehozsa nem frissti.

    Ez rdekldsre tarthat szmot egyes alkalmazsok esetben vagy objektumoknak futskzben egy panelen trtn pozcionlsakor. Az olvasn a sor, hogy kreatv legyen.

    A fastruktrn kvl a wxPython minden widget szmra fenntart egy EGYEDI azonost

    Copyright Hungarian Translation 2008 Darczy Pter 11 / 62

  • Bevezets a wxPythonba

    szmot. Ha kt objektumnak megegyezik az azonostja, az az alkalmazs nem vrt viselkedst okozhatja.

    Szval milyen rtket adjunk az id paramternek ?Ha nem szmtunk ennek a szmnak az explicit hasznlatra, akkor inkbb hagyjuk meg az

    alaprtelmezett rtket s a konstruktor paramtereit nvvel adjuk t, vagy pedig a wx.ID_ANY rtket hasznljuk, ha a paramtereket pozcijuk alapjn adjuk t. A wxPython teht automatikusan magra fogja vllalni egy ID generlst a widget-nk szmra.

    Ha nem, akkor lehetsg van a wx.NewId() fggvny segtsgvel egy id generlsra egy egyedi ID-nek egy vltozba trtn bejegyzshez s ennek a vltoznak a konstruktor paramtereknt trtn utlagos tadsra.

    Vgezetl, brmelyik legyen az alkalmazott mdszer, mindegyik widget-nek van egy GetId() metdusa ha minden ktl szakad.

    A konstruktor pos s size paramterei megadjk az objektum pozcijt s kezdeti mrett. A DefaultPosition s a DefaultSize konstansok az ppen ltrehozott objektumtl fggnek.

    Br a wxPython definilja a wx.Point s wx.Size class-okat a megfelel metdusokkal, ltalban egyszerbb egy kt egsz szmbl kpzett tuple-t hasznlni egy objektum helynek s mretnek megadshoz. Azt a goodby.py pldban megllapthatjuk.

    A wx.Window, de szmos belle leszrmaztatott widget is definil olyan stlusokat, amik befolysolhatjk az objektum megjelenst a kpernyn. Ezek azok a konstansok, amik minden widgetre ki vannak listzva a Reference manual-ban.

    Ezek a konstansok egy-egy atomi stlust definilnak. Ha tbb stlust akarunk keverni, akkor hasznlhatjuk a | (logikai VAGY) opertort. Az inverz mvelet is lehetsges, a ^ opertor segtsgvel. ami stluselemeket tvolt el egy atomi stlusokbl ll stluskeverkbl.

    Mg mindig a goodby.py pldnknl maradva, az ablakgenerl opertorok egy alkalmazsi pldjt lthatjuk.

    Ugyanakkor gyeljnk kt dologra. A Reference manual mg tvolrl sem teljes, ezrt egy internetes keress nha informatvabb a rendelkezsre ll stlusokra vonatkozan. A wxPython in action knyv is j tleteket ad.

    Az opercis rendszertl fggen a paramterek hatsa nagyon eltr lehet. Ez kellemetlen lehet a pos paramter alkalmazsakor. A ksbbiekben ltni fogunk egy fejlett pozcionlsi mdszert.

    Vgezetl, a name paramter lehetv teszi a nvadst az objektumnak, azonban ez a paramter ltszik klnsebben hasznosnak.

    Mr ismerjk a wxPython mkdsnek alapjait. A ksbbiekben ltni fogjuk a grafikus alkalmazsainkban hasznlhat klnbz objektumokat.

    Copyright 2006 Jeremy Berthet & Gilles Doge 12 / 62

  • Bevezets a wxPythonba

    4. Ablakozs

    4.1. A Frame s a Top-Level Window fogalma

    A wxPythonban egy grafikus interface legalbb egy "top-level window objektumnak" nevezett objektumot tartalmaz, ami ltalban egy wx.Frame (ablak) tpus objektum. Ezt az objektumot nem tartalmazza egy msik widget, ez az objektum a grafikus alkalmazs egyfajta "gykere". ltalban ez az az objektum, amit a grafikus alkalmazsunk fablakaknt definilunk s ami a tbbi grafikus objektumot tartalmazza.

    Tbb olyan objektumunk lehet, amiknek nincs szlobjektumuk (tbb top-level window-nk lehet), minden esetre meg kell adjuk a wxPythonnak, hogy kzlk melyiket fogjuk a f top-level window-nak tekinteni. Erre val a SetTopWindow() metdus. Ha nem adjuk meg explicit mdon, hogy melyik frame lesz a f top-level window, akkor a wxPython a wx.App -ban elsknt definilt frame-et fogja annak venni.

    4.2. Kilps az alkalmazsbl

    Az alkalmazsbl akkor lpnk ki, ha minden top-level window-t bezrtunk, vagyis ha minden szlobjektum nlkli ablak zrva van, nem csak a SetTopWindow() metdussal kijellt ablak.

    Egy frame-et bezrhatunk a Close() metdus hvsval. Az alkalmazsbl val kilps egy msik mdja a wx.Exit() globlis fggvny hasznlata. A wx.App class OnExit() metdusnak ksznheten definilhatunk egy "takartst" pontosan az azt megelz pillanatra, hogy kilpnk az alkalmazsbl. Ennek a metdusnak a hvsara akkor kerl sor, amikor "top-level window-t" bezrtuk. Ezt felhasznlhatjuk pldul hlzati kapcsolatok vagy egy adatbziskapcsolat zrsra.

    4.3. Pozcionls

    A grafikus elemeknek egy ablakban trtn pozcionlsra kt eltr megkzelts ltezik. Az els az abszolt pozcionlst alkalmazza, mg a msodik egy specilis Sizer-nek nevezett elemet hasznl.

    4.3.1. Abszolt pozcionls

    Az abszolt pozcionls klnbz objektumok elhelyezsre szolgl nagyon egyszer s intuitv eljrs. Elegend az (X, Y) koordintkat hasznlni, az orig a frame balfels sarkban van. Ez az eljrs nagyon jl mkdik akkor, amikor teles ellenrzsnk alatt ll az ablak mrete s az ablak ltal tartalmazott widget-ek szma. Minden esetre hamar elrjk ennek a megkzeltsnek a korltait, nevezetesen akkor, amikor az ablak mrete nem rgztett. Ebben az esetben a Sizer-ek hasznlatt rszestjk elnyben.

    Copyright Hungarian Translation 2008 Darczy Pter 13 / 62

  • Bevezets a wxPythonba

    4.4. Sizer-ek

    4.4.1. Pozcionls sizer-ek segtsgvel

    A Sizer egy objektum, aminek az az egyetlen feladata, hogy kezelje egy widgethalmaz elrendezst egy kontnerben. A Sizer se nem kontner, se nem widget. Valjban egy pozcionl algoritmus reprezentcija. Minden Sizer a wx.Sizer absztrakt class leszrmazottja.

    A wxPython-ban tfle Sizer van :

    Sizer tpusa Lers

    Grid Egy egyszer, szablyos rcs (mindegyik celljnak azonos a mrete). Kevss tipikus alkalmazsa : egyszer jtk tbljaknt.

    Flex Grid Rugalmas rcs, ami lehetv teszi a jobb elrendezst, amikor a widget-ek klnbz mretek.

    Grid Bag A legflexibilisebb sizer. A widget-ek tetszeges elrendezst engedi meg a rcs belsejben

    Box Hasznos a widget-ek vzszintes s fggleges elhelyezse sorn.

    Static Box Lehetv teszi egy widget-csoport bekeretezst. Szveg hozzadsra is van lehetsg.

    Egy sizer alkalmazsa hrom lpsbl ll :

    1. Ltrehozzuk a sizer-t egy kontnerben. Egy sizer-t a wx.Window (minden megjelenthet widget super-class-a) objektum SetSizer(sizer) metdusval tesznk bele egy kontnerwidget-be.

    2. A wx.Sizer Add() metdusval mindegyik gyermek-widget-et hozzkapcsoljuk a sizer-hez.

    3. (Opcionlisan) aktivljuk a sizer automatikus mretbelltst (a wx.Window Fit(window) metdusnak tbbszrs hvsval).

    Copyright 2006 Jeremy Berthet & Gilles Doge 14 / 62

  • Bevezets a wxPythonba

    4.4.2. Widget-ek hozzkapcsolsa a sizer-hez

    A widget-eknek a sizer-hez val kapcsolsra szolgl legmegszokottabb eljrs az Add() metdus alkalmazsa. Ez a sizer gyermek-widget-jei listjnak vghez hozzadja a widget-et. Az Add() metdusnak hrom vltozata van :

    Add(window, proportion=0, flag=0, border=0, userData=None)Add(sizer, proportion=0, flag=0, border=0, userData=None)Add(size, proportion=0, flag=0, border=0, userData=None)

    Az els vltozat a leggyakrabban hasznlatos, lehetv teszi egy widget (a window argumentum) hozzadst a sizerhez.A msodik vltozat lehetv teszi a sizerek egymsba gyazst.A harmadik vltozatot a size (wx.Size tpus) argumentummal definilt mret res terlet hozzadsra hasznljuk.

    A tbbi paramter a widget elrendezsnek mdjt fogja befolysolni. Szmos paramter csak bizonyos sizer-ek esetben ll rendelkezsre. A proportion argumentumot csak a boksz sizer hasznlja. Ez a paramter adja meg, hogy hogyan lesz jramretezhet az elem, amikor a kontnere megvltoztatja a mrett.A flag argumentummal lehet a kiratsi opcikat megadni (mint az elrendezst, a keretet vagy az jramretezst). A border argumentum hatrozza meg a keret mrett, ha a flag paramterrel keretet definiltunk. Vgezetl, a userData paramtert abban az esetben hasznlhatjuk, amikor sajt sizer-t definilunk.A flag paramterben tadand klnbz konstansok megtallhatk az API dokumentcijban a wx.Sizer Add metdusnak lersa alatt.Lteznek ms metdusok is a widget-ek sizer-hez kapcsolsra. Az Insert() metdus egy pozciindex megadsval kapcsol a sizer-hez egy widget-et, a Prepend() metdus azonos az Add() -dal, az a klnbsg a kt metdus kztt, hogy az elbbi a lista elejhez adja a widget-et. Tovbbi informcik a wxPython dokumentcijban tallhatk.

    4.4.3. Widget-ek trlse a sizer-bl

    A Detach() metdussal lehet levlasztani egy widget-et a sizer-rl. Ez a metdus nem rombolja le az objektumot !

    Hrom vltozata van :

    Detach(window)Detach(sizer)Detach(index)

    Ez a metdus mindhrom esetben egy boolean rtket ad visszatrsi rtkl. A visszatrsi rtk false, ha olyan elemet prblunk meg trlni, ami nincs a sizer-hez kapcsolva.Az els utasts egy widget-et, a msodik egy sizer-t, a harmadik a paramterben megadott indexrtknek megfelel elemet trli.

    Egy elem levlasztsa a sizer-rl nem fogja megvltoztatni az automatikus kiratst. Ehhez a Layout() metdust kell hvni.

    Copyright Hungarian Translation 2008 Darczy Pter 15 / 62

  • Bevezets a wxPythonba

    4.5. A Grid Sizer

    A legegyszerbb sizer, amint a neve is jelzi. Egy ktdimenzis rcsrl van sz melyben a gyermek-widget-ek balrl jobbra s fellrl lefel vannak elhelyezve. Tudni kell, hogy a sizer-nek van egy bels listja a gyermek-widget-ekrl. Ennek a listnak az els widget-e a balfels sarokban fog elhelyezkedni.

    Amikor tmreteznk egy grid sizer-t, akkor minden cella mrete azonos mdon fog megvltozni. Alaprtelmezetten ez a mret a rcsbeli legnagyobb widget mretn alapul s a gyermek-widget-ek mrete nem alkalmazkodik az elbbihez.A Grid Sizer konstruktornak a kvetkez a prototpusa :

    wx.GridSizer(rows, cols, vgap, hgap)

    Ahol :

    rows : a rcs sorainak szma cols : a rcs oszlopainak szma vgap : az oszlopok kztti fggleges sv hgap : az oszlopok kztti vzszintes sv

    Ha a rows vagy a cols rtke 0, akkor a sorszm vagy az oszlopszm a sizer-hez kapcsolt widget-ek szmtl fog fggeni. Ha pldul a sizer-t a kvetkez paramterrtkekkel hoztuk ltre : wx.GridSizer(2, 0, 0, 0) s a sizer-hez 8 widget van kapcsolva, akkor azok 2 sorban s 4 oszlopban lesznek.

    A rows, cols, vgap s hgap tulajdonsgok mindegyiknek van setter s getter metdusa : GetRows(), SetRows(rows), GetCols(), SetCols(cols), GetVGap(), SetVGap(vgap), GetHGap(),

    SetHGap(hgap).

    4.6. A Flex Grid Sizer

    Ez a sizer flexibilisebb, mint az elbb ltott Grid Sizer. Az albbiakban felsoroljuk a fbb klnbsgeket :

    Minden sor s oszlop mrett kln hatrozza meg.

    Alaprtelmezetten nem vltoztatja meg automatikusan a celli mrett amikor tmretezzk. Megadhatjuk, hogy egy mretvltozs sorn mely sorokat s mely oszlopokat fogja automatikusan jramretezni.

    Egy Flex Grid Sizer konstruktornak ugyanazok a paramterei, mint a Grid Sizer-nek :

    wx.FlexGridSizer(rows, cols, vgaps, hgap)

    Annak definilshoz, hogy mely sorok vagy oszlopok "nhetnek meg" a sizer mretnek fggvnyben, a kvetkez paramtereket kell a konstruktornak tadni :

    AddGrowableCol(idx, proportion=0)AddGrowableRow(idx, proportion=0)

    Az els paramter azt az oszlopot vagy sort adja mag, amelyiknek vltoz mretv kell vlni (egy 0 s N-1 kz es egsz).

    Copyright 2006 Jeremy Berthet & Gilles Doge 16 / 62

  • Bevezets a wxPythonba

    Amikor a sizer mrete vzszintesen n, akkor alaprtelmezetten gy mkdik, hogy az j mret megoszlik a(z AddGrowableCol() metdussal) vltoz mretnek definilt oszlopok kztt. Ugyanez vonatkozik a sorokra a sizer fggleges irny mretvltozsa esetn. A proportion paramter hasznlatval megvltoztathatjuk ezt az alaprtelmezett viselkedst.

    Pldul, ha a 2 vltoz mret oszlopot definiltunk s az arnyaik 2 s1, akkor az els oszlop a rendelkezsre ll terlet 2/3-t, mg a msodik oszlop csak az 1/3-t fogja elfoglalni.

    Ha a vltoz mret oszlopaink egyikre megadjuk az arnyt, akkor minden vltoz mret oszlop szmra meg kell adni egy arnyt. Ugyanez vonatkozik a sorokra.

    4.7. A Grid Bag Sizer

    A flex grid sizer tovbbfejlesztett vltozata a grid bag sizer. Kt lnyeges jdonsgot vezet be :

    Lehetsget ad arra, hogy a rcs egy meghatrozott celljba tegynk egy widget-et.

    Lehetsg van a sorok vagy az oszlopok egyestsre.

    Egy Grid Bag Sizer konstruktornak nincs szksge sorszmokra s oszlopszmokra, mert az objektumainkat egy sor- s egy oszlopszm direkt megadsval szrjuk be.

    A kvetkez a prototpusa :

    wx.GridBagSizer(vgaps=0, hgap=0)

    4.7.1. Egy widget hozzkapcsolsa a wx.GridBagSizer-hez

    A grid bag sizer Add() metdusa az elbb bemutatott sajtossgok miatt klnbzik ms sizer-ek Add() metdusaitl.

    Hrom vltozata van, mint a wx.Sizer generikus Add() metdusnak :

    Add(window, pos, span=wx.DefaultSpan, flag=0, border=0, userData=None)Add(sizer, pos, span=wx.DefaultSpan, flag=0, border=0, userData=None)Add(size, pos, span=wx.DefaultSpan, flag=0, border=0, userData=None)

    Ami vltozott, az a pos s span paramterek megjelense. A pos paramterrel lehet megadni, hogy hova fogjuk beszrni a widget-et. Ez egy (sor, oszlop) tuple, a (0,0) hivatkozs a sizer balfels sarkt jelenti. Pldul : a (0,2) tuple-t kell megadni ahhoz, hogy egy objektumot az els sorba s a harmadik oszlopba szrjunk be.

    A span paramter azoknak az oszlopoknak s soroknak a szmt reprezentlja, amiket egyesteni kell. Ha pldul azt akarjuk, hogy a widget-nk 3 sort s 2 oszlopot foglaljon el, akkor a (3,2) tuple-t kell megadnunk.

    A fggelkben tallhat egy plda (gridbagsizer.py) a grid bag sizer alkalmazsra.

    Copyright Hungarian Translation 2008 Darczy Pter 17 / 62

  • Bevezets a wxPythonba

    4.8. Box Sizer

    A box sizer egyetlen oszlop vagy sor, amiben a widget-ek egyms utn fellrl lefel illetve balrl jobbra vannak elhelyezve.

    A konstruktornak csak egy paramtere van, ami az irnyt hatrozza meg :

    wx.BoxSizer(orient)

    Az orient paramter a wx.VERTICAL (fggleges elrendezs) vagy wx.HORIZONTAL rtkeket veheti fel. Ezt kveten nem vltoztathatjuk meg a sizer irnyt, csak arra van lehetsg, hogy a GetOrientation() metdussal megtudjuk merre fele irnyul.

    4.9. A Static Box Sizer

    A static box sizer egy box sizer-t s a static box objektumot kombinl. A static box objektum teszi lehetv a widget-ek vzulis csoportostst gy, hogy szveges kerettel veszi krl a widget-eket. A wx.StaticBox class teszi lehetv ennek az objektumnak a ltrehozst. Az ehhez a csoporthoz tartoz widget-eket nem lehet kzvetlenl belevenni egy wx.StaticBox tpus objektumba, teht ltre kell hozni egy sizer-t. A krdses sizer-t wx.StaticBoxSizer -nek nevezik.

    Egy plda :

    box = wx.StaticBox(self, -1, "Label du groupe")sizer = wx.StaticBoxSizer(box, wx.VERTICAL)btn1 = wx.Button(self, -1, "Bouton 1")btn2 = wx.Button(self, -1, "Bouton 2")sizer.Add(btn1, 0, 0)sizer.Add(btn2, 0, 0)self.SetSizer(sizer)sizer.Fit(self)

    Elszr egy wx.StaticBox objektumot hozunk ltre, amit ssze fogunk kapcsolni egy wx.StaticBoxSizer-rel. Ezutn hozzkapcsoljuk a widgeteket a sizer-hez.

    4.10. Prbeszddobozok (dialogbox-ok)

    A wxPython az elre definilt prbeszddobozok szles skljt knlja a felhasznlnak. Ezek mind ugyanattl a wx.Dialog szl-class-tl szrmaznak.

    4.10.1. Prbeszddoboz egy egyszer zenettel

    A felhasznlval trtn kommunikcira szolgl legegyszerbb prbeszddoboz a wx.MessageDialog. Ez egy egyszer doboz egy zenettel, mely esetben a kirand gombok konfigurlhatk. A kvetkez kd egy modlis ablakot hoz ltre, ahol igennel vagy nemmel kell vlaszolni.

    msgDlg = wx.MessageDialog (None, 'Mangez-vous beaucoup de pommes ?', 'Question 1', wx.YES_NO | wx.ICON_QUESTION)

    Copyright 2006 Jeremy Berthet & Gilles Doge 18 / 62

  • Bevezets a wxPythonba

    reponse = msgDlg.ShowModal()# traitement selon reponse ici...

    # Destruction de la boite de dialoguemsgDlg.Destroy()

    Az zenetet tartalmaz prbeszddoboz konstruktornak prototpusa a kvetkez :

    wx.MessageDialog ( parent, message, caption="Message box", style=wx.OK | wx.CANCEL, pos=wx.DefaultPosition )

    Itt a parent paramter a szlablakot jelenti (Nem mint ha a prbeszddoboznak egy Top-Level window-nak kellene lenni.) A message paramter a kirand karakterlncot tartalmazza s a caption paramter az a cm, aminek az ablak cmben meg kell jelenni. Jegyezzk meg, hogy MacOS X alatt, a caption karakterlnc nem jelenik meg az ablak cmben, hanem az zenet fltt flkvr betstlussal rdik ki. A style paramterrel definilhatjuk, hogy mely gombok jelenjenek meg a modlis ablakban, st elredefinilt ikonokat is kirathatunk. Az utols pos paramterrel adhatjuk meg, hogy a prbeszddoboz hol jelenjen meg a kpernyn.

    A ShowModal() metdus kiratja a modlis ablakot s visszatrsi rtkknt megadja annak a gombnak az (int tpus) azonostjt, amelyik gombra kattintottunk. Amikor a prbeszddoboz kirdik, akkor az alkalmazs tbbi ablaka inaktvv vlik. Ez a metdus minden prbeszddoboz esetben azonos. A kvetkez kornt sem kimert lista a visszatrsi rtkeit kzl felsorol nhnyat : wx.ID_YES, wx.ID_NO, wx.ID_CANCEL, wx.ID_OK.

    Egy modlis ablak stlusai a kvetkezk lehetnek : wx.OK, wx.CANCEL, wx.YES_NO, wx.YES_DEFAULT, wx.NO_DEFAULT, wx.ICON_ERROR, wx.ICON_EXCLAMATION, wx.ICON_INFORMATION, wx.ICON_QUESTION.

    Ezek a ( | opertorral) a bitmaszk-elvnek megfelelen kombinlhatk.

    4.10.2. Prbeszddoboz adatberssal

    Egy msik prbeszddoboz tpus egy ablak, amiben van egy adatbeviteli mez. A wxPython ezt a wx.TextEntryDialog class-bl hozza ltre :

    wx.TextEntryDialog (parent, message, caption="", defaultValue, style, pos)

    A defaultValue az adatbeviteli mez alaprtelmezett rtke. A GetValue() s SetValue(value) metdusokkal hozzfrhetnk az adatbeviteli mez tartalmhoz vagy mdosthatjuk azt.

    4.10.3. Prbeszddoboz egyszeres kivlasztssal

    Ez a prbeszddoboz lehetv teszi egy rtk kivlasztst egy rtkkszletbl. Ezt az rtkkszletet lista (listbox) reprezentlja. A listt kezel class a wx.SingleChoiceDialog :

    wx.SingleChoiceDialog (parent, message, caption, choices, style, pos)

    A paramterei megegyeznek a wx.TextEntryDialog konstruktornak paramtereivel, azzal a klnbsggel, hogy egy karakterlnc helyett ez esetben egy karakterlncokbl ll listt adunk meg.

    Plda :

    Copyright Hungarian Translation 2008 Darczy Pter 19 / 62

  • Bevezets a wxPythonba

    listeOS = ['Linux', 'MacOS X', 'Windows', 'Autres']dlg = wx.SingleChoiceDialog (self, 'Quel est votre OS ?', 'Question 2', listeOS)

    if dlg.ShowModal() == wx.ID_OK: nomOS = dlg.GetStringSelection() idOS = dlg.GetSelection()

    A GetStringSelection() metdussal hozzfrhetnk a kivlasztott karakterlnchoz, mg a GetSelection() metdus a kivlasztott elem indext adja meg. A SetSelection(index) metdussal is definilhatunk egy kivlasztst.

    4.10.4. Prbeszddoboz tbbszrs kivlasztssal

    Az elz prbeszddoboz csak egyetlen egy elem kivlasztst tette lehetv a listbl, a wx.MutliChoiceDialog tbb elem kivlasztst teszi lehetv. A GetSelections() metdust hasznljuk a kivlasztott elemek indeexlistjnak kinyersre s a SetSelections(selections) metdust a kivlasztsok definilsra !

    4.10.5. Egyb prbeszddobozok

    A wxPython knyvtr szmos egyb prbeszddobozt knl, mint amilyenek a file/folder megnyitsra, sznvlasztsra, fontkszletvlasztsra, keressre-cserre, stb. szolgl prbeszd-dobozok.

    A pldkat tartalmaz folderben az olvas tallni fog dialog.py nev scriptet, ami az elbbiekben ltott modlis ablakokat alkalmazza, valamint egy "sznvlasztt".

    Copyright 2006 Jeremy Berthet & Gilles Doge 20 / 62

  • Bevezets a wxPythonba

    5. A fkusz kezelse

    Ebben a fejezetben s a kvetkezben a gestion_liste.py programpldval foglalkozunk.

    Az emltett fejezetek bemutatjk a felhasznl - program belsejben trtn - kvetst tmogat fkuszkezelsi lehetsgeket. Tbb olyan alapwidget-et hasznlnak, amiket a 8. fejezetben fogunk bemutatni.

    Ebben a pldaprogramban a felhasznl fkusszal trtn kvetsnek kezelse tvolrl sem tkletes. Ha az olvas gyakorolni akar, arra biztatjuk, tkletestse.

    5.1. Fkuszesemnyek

    Minen egyes alkalommal, amikor egy widget ilyen, vagy olyan mdon megkapja a fkuszt, akkor generl egy wx.EVT_SET_FOCUS esemnyt, ami ignynk szerint kezelhet.

    self.lstListe.Bind(wx.EVT_SET_FOCUS, self.OnListSelect)

    A pldban amikor a lista megkapja a fkuszt (teht egy elemet kivlasztottunk), akkor a "Modifier" s "Supprimer" gombok aktivlva vannak. gy lthatunk a Bind() metdus alkalmazsra egy olyan pldt, ahol a metdust nem egy Frame, hanem egy ms widget-en alkalmazzuk.

    Szimmetrikusan, egy widget, ami elveszti a fkuszt, generl egy wx.EVT_KILL_FOCUS esemnyt.

    5.2. Manulis fkusz

    Nha rdekes lehet a fkusz manulis tadsa egy adott widget-nek, specilisan bizonyos programbeli mveletek utn.

    A wx.Window class-nak (s kvetkezsknt a belle leszrmaztatott kontroloknak) van egy SetFocus() metdusa, ami tadja a fkuszt a widget-nek s a fntebb emltett wx.EVT_SET_FOCUS s wx.EVT_KILL_FOCUS esemnyeket ltrehozza.

    5.3. Fkusz letiltsa

    Az Enable() metdus segtsgvel, aminek egyetlen boolean paramtere van, megakadlyozhatjuk, hogy egy widget megkapja a fkuszt.

    A widget inaktvv vlik, ha a boolean paramter rtke False s tbbet nem kapja meg a fkuszt. Nyilvnvalan ez az llapot trlhet a metdus True paramterrtkkel trtn hvsval.

    5.4. Navigci tabultorral

    Alaprtelmezetten csak egy wx.Panel vagy egy wx.Dialog tpus widget belsejben aktv a tabultoros navigci. Vannak r eszkzk, hogy aktivljuk ms kontnerekben, de ezt a lehetsget nem fogjuk trgyalni ennek a dokumentumnak a keretben.

    Ez az oka, hogy a pldaprogramnak van egy wx.Panel objektuma, amibe bele van tve a f-sizer.

    Copyright Hungarian Translation 2008 Darczy Pter 21 / 62

  • Bevezets a wxPythonba

    Elvben a navigci sorrendje megegyezik a wx.Panel gyermekobjektumainak Python kdon belli ltrehozsnak sorrendjvel.

    A dinamikus widget-krels keretben vagy amikor a kdot vilgoss kell tenni, a kvetkez metdusok segtsgvel egy widget-et egy msik widget el vagy utn lehet tenni a navigcis sorrendben.

    MoveBeforeInTabOrder(win)MoveAfterInTabOrder(win)

    A programpldban az "Enregistrer" gombnak a lista eltt kell megkapni a fkuszt, amikor a felhasznl megnyomja a billentyt.

    self.cmdEnregistrer.MoveBeforeInTabOrder(self.lstListe)

    5.5. Mnemonikus billentyk

    Egy kontner (wx.Panel s wx.Dialog) belsejben definilni lehet (egy gomb szmra) egy alaprtelmezett parancsot, aminek a vgrehajtsra akkor kerl sor, amikor megnyomjuk az billentyt. Ehhez egyszeren csak hvni kell a widget SetDefault() metdust, amit ennek a funkcinak a megvalstsra szntak.

    A programpldban :

    self.cmdEnregistrer.SetDefault()

    A klnbz menpontokhoz s (kizrlag Windows alatt) egy frame-ben lv gombokhoz is lehet mnemonikus billentyket asszocilni.

    Ehhez egy hrom elem tuple-kbl ll listt kell ltrehozni, ami az asszocicis tbla hivatalt fogja betlteni. Ezek a tuple-k lesznek polymorfizmus rvn a wx.AcceleratorEntry -k s (flag, keycode, cmdID) formban jelennek meg.

    A flag azokat a specilis billentyket reprezentlja (, , etc ), amiket a felhasznlnak le kell nyomni. A wx.ACCEL_ALT, wx.ACCEL_SHIFT, wx.ACCEL_CTRL konstansok definiljk ket s az 5.4 fejezetben ltott bitmaszktechnikval kombinlhatk.

    A keycode az a billenty, amit a specilis billentykkel kell kombinlni, hogy aktivldjon a parancs. Egy egsz szmrl van sz, amit az ord() fggvny alkalmazsval hatrozhatunk meg gy, paramterknt a kvnt bett adjuk meg.

    Vgl a annak a menpontnak vagy annak a gombnak az id-je, amelyiket a mnemonikus billentyvel kell asszocilni. Ez az els effektv alkalmazsa azoknak az egyedi azonostknak, amikrl az 5.4 fejezetben rviden szltunk.

    A pldaprogram tartalmaz egy defincis tbla pldt gombok szmra :

    table = [(wx.ACCEL_ALT, ord('E'), self.cmdEnregistrer.GetId()), (wx.ACCEL_ALT, ord('M'), self.cmdModifier.GetId()), (wx.ACCEL_ALT, ord('S'), self.cmdSupprimer.GetId()), (wx.ACCEL_ALT, ord('Q'), self.cmdQuitter.GetId())]

    Ha mr definilva van a tbla, elegend generlni egy wx.AcceleratorTable objektumot annak a frame-nek a SetAcceleratorTable() metdusval, amelyik frame a definilt billentyk rvn rintett lesz. Paramterknt meg kell adni a defincis tblt.

    Copyright 2006 Jeremy Berthet & Gilles Doge 22 / 62

  • Bevezets a wxPythonba

    self.SetAcceleratorTable(wx.AcceleratorTable(table))

    Ahhoz, hogy a vezrlcmkben al legyen hzva a bet, egy "&" -t kell el rni. pl.: "&File".Mlyebb ismeretek szerzshez, illetve a rendszer tkletestshez a wxPython wiki egyik cikke

    javasol egy navigcis megoldst mnemonikus billentyvel:(http://wiki.wxpython.org/index.cgi/FocusingControlsWithTheirLabels).

    Copyright Hungarian Translation 2008 Darczy Pter 23 / 62

  • Bevezets a wxPythonba

    6. Fwidget-ek

    Azutn, hogy bemutattuk a gestion_liste.py pldaprogramban a fkuszkezels aspektust, sszefoglal jelleggel ttekintjk a pldaprogramot alkot klnbz widget-eket.

    Ebben a fejezetben csak az alapwidget-eket s a velk asszocilt ffunkcikat fogjuk bemutatni. A widget-ek lehetsgei gyakran sokkal nagyobbak, gy ezen a szinten a wxPython wiki s a hivatalos dokumentci hasznosak lesznek.

    6.1. wx.StaticText

    Ms felhasznli interface knyvtrakban ezt a widget-et gyakran "label"-nek hvjk. Felhasznl ltal nem mdosthat egyszer szveg kpernyre trtn kiratst teszi lehetv.

    Konstruktora a kvetkez alak :

    wx.StaticText(parent, id=-1, label=EmptyString, pos=DefaultPosition, size=DefaultSize, style=0, name=StaticTextNameStr)

    Semmi tlzottan j nincs a wx.Window konstruktorhoz kppes, csak a label paramter megjelense nem az. A paramterben adjuk meg azt a szveget, amit a generlt widget ki fog rni.

    A widget szvegt a wx.Control class-tl rklt metdus segtsgvel lehet mdostani :

    SetLabel(text)

    Analg mdon, a szveg a GetLabel() metdussal nyerhet ki.gy akadlyozhatjuk meg, hogy a widget szlessge tlsgosan megnjn, hogy n pixel utn

    automatikus return-k beszrst krjk a sorokba. Ez a kvetkez metdus segtsgvel trtnik :

    Wrap(width)

    Figyelem : a widget szlessgnek levgsa csak a szavak vgn trtnik meg. Ha az engedlyezett mret kisebb, mint egyes szavak hossza, az problmkat okozhat.

    6.2. wx.TextCtrl

    Szmos felhasznli interface ksztsre sznt knyvtrtl eltren a wxPython-ban az egysoros s tbbsoros szvegbeviteli mezt ugyanaz a widget reprezentlja.

    Konstruktora :

    wx.TextCtrl( parent, id=-1, value=EmptyString, pos=DefaultPosition, size=DefaultSize, style=0, validator=DefaultValidator, name=StaticTextNameStr)

    A wx.StaticText label paramtere itt talakult value -v, de ugyanazt a funkcit reprezentlja.A validator paramter lehetv teszi egy wx.PyValidator class-bl leszrmaztatott objektum

    asszocilst. A validtor egy class, ami a Validate() metdus overload-olsval lehetv teszi egy kontrol tartalmnak egyszer vizsglatt. Ebben a dokumentumban nem fogjuk rszletezni ezt a lehetsget.

    Egy wx.TextCtrl -nak alaprtelmezetten csak egyetlen szvegsora lehet. Ez megvltoztathat a

    Copyright 2006 Jeremy Berthet & Gilles Doge 24 / 62

  • Bevezets a wxPythonba

    wx.TE_MULTILINE stlus alkalmazsval.A felhasznl ltal bert szveg kinyershez tbb metdus is rendelkezsnkre ll (mindegyik

    visszatrsi rtke egy String)

    GetLineText(self, lineNo)GetString(self, from, to)GetRange(self, from, to)GetStringSelection(self)

    Az elsvel egy adott sor szvegt nyerhetjk ki a sor sorszmnak megadsval. Mint a programpldban, a wx.TextCtrl egysoros, ezzel a metdushvssal az egsz szveg kinyerhet :

    self.txtEntry.GetLineText(0)

    A msodik s a harmadik metdussal kt karakterpozci kztt lehet kinyerni a szveget. (Az els karakter a 0 pozciban van.) Egy tbbsoros wx.TextCtrl esetben egy egyszer mdszer az egsz szveg kinyersre :

    self.txtMultiligne.GetString(0, self.txtMultiligne.GetLastPosition())

    Vgl a negyedik metdussal a felhasznl ltal kivlasztott szveget nyerhetjk ki a widget-bl.A szveget programozott mdon is be lehet rni a kvetkez metdusoknak ksznheten :

    SetValue(self, value)LoadFile(self, file)AppendText(self, text)WriteText(self, text)

    Az els a widget-beli rgi szveget helyettesti a value karakterlnccal.A msodik viselkedse megegyezik az elsvel, csak itt egy szvegfile tartalmval helyettesti a

    widget-beli rgi szveget.A kt kvetkez metdus a widget-ben mr meglv szveg vghez, illetve a beszrkurzor

    utn illeszti a szveget.Mindegyik esetben a szveghozzad metdus vgrehajtsnak vgn a beszrkurzor a beszrt

    szveg vgn tallhat.Szksg esetn lehetsg van a beszrkurzor manipullsra a GetInsertionPoint() s a SetInsertionPoint() metdusok segtsgvel. Hasznlatuk mdjt nem nehz kitallni.

    Vgezetl, lehetsg van a szvegstlus globlis vagy a wx.TextCtrl -re lokalizlt paramterezsre A ehhez metdusok mint egy wx.TextAttr class llnak rendelkezsnkre. Az olvasra hagyjuk a wxPython s wxWidgets dokumentcik knlta lehetsgek felfedezst.

    6.3. wx.Button

    A menk s a mnemonikus billentyk mellett a gombok a felhasznl feszkzei, amik az alkalmazsbeli kvnsgai rvnyestsre szolglnak.

    A szveget tartalmaz standard gombok generlsra val wx.Button class mellet a wxPythonnak van egy msik wx.BitmapButton subclass-a, ami lehetv teszi a gombban a szveg kppel trtn helyettestst.

    A viszonylag fejlett alkalmazsokban a gombok ltalban az eszkzsvban vannak csoportostva,

    Copyright Hungarian Translation 2008 Darczy Pter 25 / 62

  • Bevezets a wxPythonba

    amire vonatkozan a referencia kziknyvben a wx.ToolBarBase class s leszrmazottainak lerst tanulmnyozva szerezhet az olvas informcikat.

    A wx.Button class konstruktora a kvetkez :

    wx.Button(parent, id=-1, label=EmptyString, pos=DefaultPosition, size=DefaultSize, style=0, validator=DefaultValidator, name=ButtonNameStr)

    A class-nak nincs sok metdusa. Tekintettel arra, hogy a wx.Control leszrmazottja, a wx.StaticText -nl ltott SetLabel() s GetLabel() metdusok teszik lehetv a gomb szvegnek manipullst.

    6.4. wx.ListBox

    Ez a class egy vlaszthat karakterlncokbl ll listt reprezentl. Az ilyen listkat ltalban arra hasznljk, hogy a felhasznlknak egyszerre tbb kivlasztst engednek meg a programban. A pldaprogramban adattrolknt hasznljuk, amit knny lesz szinkronizlni pldul egy kis adatbzissal.

    Elszr is tudni kell, hogy a wx.ListBox egy wx.ItemContainer interface-bl szrmazik, ami rendelkezsnkre bocstja azokat az elem manipulcis metdusokat, amiket a wx.ComboBox -okban tallnnk. Melegen ajnljuk ez utbbiak tanulmnyozst, ezeket nem fogjuk trgyalni ebben a jegyzetben.

    A konstruktor a kvetkez alak :

    wx.ListBox(parent, id=-1, pos=DefaultPosition, size=DefaultSize, choices, style=0, validator=DefaultValidator, name=ListBoxNameStr)

    A choices paramter egy lista vagy egy tuple, ami karakterlncokbl ll, melyek utbbiak egyesvel lesznek beolvasva s beletve a wx.ListBox -ba.

    Szmtsba kell venni a style paramtert is. A wx.TextCtrl mintjnak megfelelen egy wx.ListBox kt -fle mdon mkdhet. Vagy csak egy elem kivlasztst fogadja el (wx.LB_SINGLE), vagy egyidejleg tbb elem is kivlaszthat.

    Radsul az utbbi mkdsi md mg kt fle kppen viselkedhet. Vagy az trtnik, hogy egy elemre trtn kattints kivlasztja az illet elemet, illetve megsznteti az illet elem kivlasztst (wx.LB_MULTIPLE), vagy a felhasznl hasznlhatja a s billentyket tbb elem kivlasztsra, illetve tbb elem kivlasztsnak megszntetsre (wx.LB_EXTENDED).

    Alaprtelmezetten egy wx.ListBox stlusa wx.LB_SINGLE.Egy wx.ListBox -nak szmos olyan metdusa van, amik hasonltanak egy Python lista azon

    metdusaira, amik egy listaelem hozzadsra, mdostsra vagy trlsre szolglnak az elem indexe alapjn. Ennek ellenre ez a widget-et nem felttlenl erre a fajta hasznlatra ksztettk. A kvetkez metdus val a tartalma generlsra :

    Set( items )

    Ez a metdus mdostja a konstruktorban ltott choice paramtert. Ez a mvelet megsemmisti a lista rgi tartalmt.

    Egy wx.ListBox -nak az az rtelme, hogy vlasztsi lehetsget knl a felhasznlnak, ezrt kpeseknek kell lennnk arra, hogy megtudjuk, mit vlasztott a felhasznl.

    Copyright 2006 Jeremy Berthet & Gilles Doge 26 / 62

  • Bevezets a wxPythonba

    Egy elem kivlasztst megenged wx.ListBox esetben (mint a milyen a pldaprogramban is van) a kvetkez metdusok segtsgvel tudhatjuk meg az indexet illetve a kivlasztott objektum tartalmt :

    GetSelection()GetStringSelection()

    Ha semelyik elemet sem vlasztottuk ki, akkor az els metdus visszatrsi rtke a wx.NOT_FOUND konstans, mg a msodik egy res karakterlnc lesz. szre fogjk venni, hogy ezek ugyanazok a metdusok, mint amiket a "Prbeszddobozok tbbszrs kivlasztssal" cm fejezetben lttunk.

    Tbbszrs vlasztst megenged wx.ListBox esetben egyetlen egy metdus ll a rendelkezsnkre :

    GetSelections()

    A listbl kivlasztott elemek indexeibl ll tuple-t ad visszatrsi rtkknt.Vgezetl, a wx.ListBox -hoz kt nagyon hasznos esemny tartozik a : wx.EVT_LISTBOX s a

    wx.EVT_LISTBOXDCICK. Az elbbi akkor generldik, amikor a felhasznl kivlaszt egy elemet, a msodik akkor, amikor a felhasznl kettt kattint egy listaelemre.

    A pldaprogramban a "Modifier" s "Supprimer" gombok csak akkor aktivldnak, amikor a felhasznl kivlasztottunk egy listaelemet.

    GetSelections()

    J gyakorlat lenne a program olyan tkletestse, hogy a felhasznlnak azonnal ajnljuk fel annak az elemnek a mdostst, amire dupln kattintott.

    6.5. wx.RadioBox/wx.CheckListBox

    Ez a kt widget meglehetsen hasonlt egymsra, lehetv teszik, hogy a felhasznl tbb lehetsg kzl : egyetlen egyet vlasszon ki a wx.RadioBox esetben, illetve hogy egyidejleg tbbet vlaszthasson ki a wx.CheckListBox esetben.

    A radio_check.py programban lthatjuk, hogy hogyan jelennek meg ezek a widget-ek egy grafikus interface-ben.

    Egy wx.RadioBox -ban tett kivlasztsokat "rdigomboknak" (radio button) hvjuk. A wx.RadioButton class teszi lehetv ezek manulis definilst. A wx.RadioBox egy egyszer s knyelmes mdot knl az utbbiak csoportostsra.

    Egy wx.RadioBox konstruktor a kvetkez alak :

    wx.RadioBox(parent, id=-1, label=EmptyString, pos=DefaultPosition, size=DefaultSize, choices=wxPyEmptyStringArray, majorDimension=0, style=RA_SPECIFY_COLS, validator=DefaultValidator, name=RadioBoxNameStr)

    A label paramter egy String s a rdigombok csoportjhoz asszocilt szveget reprezentlja. A programpldban ltjuk, hogy a keretbe rdik ki.

    A choices paramter egy stringekbl ll lista vagy tuple, ami a felhasznl rendelkezsre ll klnbz vlasztsi lehetsgeket reprezentlja.

    A majorDimension paramter meghatrozza a stlusvlasztstl fggen a widget maximlis sor

    Copyright Hungarian Translation 2008 Darczy Pter 27 / 62

  • Bevezets a wxPythonba

    vagy oszlopszmt.A stlus a wx.Window -tl rklt rtkeken fell flveheti a wx.RA_SPECIFY_COLS illetve

    wx.RA_SPECIFY_ROWS rtkeket. Ezek az rtkek teszik lehetv annak meghatrozst, hogy a majorDimension paramtert oszlopra vagy sorra alkalmazzuk, amikor a widget majd elrendezi a vlasztsi lehetsgeket.

    A programpldban a stlus paramternek a wx.RA_SPECIFY_ROWS s a majorDimension paramternek a 0 (semleges) rtket lltottuk be, teht a 4 vlasztsi lehetsg klnbz sorokba rdik ki. Ha pldul a majorDimension rtkt 2-re lltottuk volna be, akkor a vlasztsi lehetsgek 2 oszlopba rdtak volna ki, mert a widget ebben az esetben azt rtuk volna el, hogy csak kt sort tartalmazhat.

    Az elz rszben ltott wx.ListBox -hoz kppest az a klnbsg, hogy a wx.RadioBox -nak semmilyen metdusa sincs a rendelkezsre ll vlasztsi lehetsgek megvltoztatsra. Ez egy statikus struktra a felhasznli interface-ben.

    A felhasznl vlasztst ugyanazokkal a metdusokkal tudhatjuk meg, mint amikkel egy wx.ListBox esetben :

    GetSelection()GetStringSelection(self)

    Ezek a metdusok ugyangy mkdnek, mint egy wx.ListBox azonos nev metdusai s mint egy wx.ListBox, a wx.RadioBox mindig generl egy wx.EVT_RADIOBOX esemnyt, amikor a felhasznl rkattint egy rdigombra.

    A wx.CheckListBox mg kzelebb ll egy wx.ListBox -hoz, mivel kzvetlenl abbl szrmazik !Ebbl a tnybl ereden a megjelense eltr a szoksos grafikus interface-ekben megszokott

    jellngyzet megjelenstl.Egy wx.CheckListBox konstroktornak a kvetkez a formja :

    wx.CheckListBox(parent, id, pos, size, choices, style, validator, name)

    Ez a konstruktor pontosan ugyanolyan, mint a wx.ListBox konstruktora. A wx.CheckListBox kt metdust s egy kiegszt esemnyt bocsjt a rendelkezsnkre :

    Check(self, item, check=true)IsChecked(self, item)

    Az els lehetv teszi, hogy egy jell ngyzetet az indexe alapjn bejelljnk (vagy a bejellst megszntessk, a check paramternek a False rtket adva).

    A msodik lehetv teszi ugyancsak az indexe alapjn , hogy megtudjuk, a jell ngyzet be van-e jellve vagy sem.

    Nagyon fontos, hogy klnbsget tegynk egy kivlasztott elem s egy bejellt kztt. Az rklt GetSelections() metdus nem fogja visszatrsi rtkknt megadni a bejellt jellngyzetek indexlistjt, hanem helyesen, valban a a kirt listban standard mdon kivlasztott elemek indexeinek a listjt.

    gy a felhasznl kivlasztsainak megismershez vgig kell iterrlnunk az sszes indexen s minden iterrcis lpsnl ellenriznnk kell, hogy a kontrol be van-e jellve, mieltt valamilyen akcit hajtannk vgre.

    for id in range(0, 4): if self.checkListBox.IsChecked(id): resultNumeric += int(self.checkListBox.GetString(id))

    Copyright 2006 Jeremy Berthet & Gilles Doge 28 / 62

  • Bevezets a wxPythonba

    A wx.CheckListBox egy j esemnyt - ez a wx.EVT_CHECKLISTBOX esemny biztost a programoznak annak rdekben, hogy klnbsget lehessen tenni a kivlaszts/kivlaszts trlse s a bejells/ bejells trlse kztt.

    Az olvas minden bizonnyal szrevette, hogy ez a widget nem igazn konvencionlis. A felhasznl ltalban hozz van szokva, hogy jellngyzetekbl ll felletei vannak, amiknek a megjelense hasonlt egy wx.RadioBox -ra. Ilyen eredmny gy kaphat, hogy egy wx.RadioBox -szal sszekapcsolt wx.StaticBoxSizer belsejben egymsbarakunk egy wx.Panel -t s wx.CheckBox widget-eket. J gyakorlat lesz ezt az utat kvetve kifejleszteni egy wx.RadioBox -ra hasonlt wx.CheckBoxBox class -t.

    Copyright Hungarian Translation 2008 Darczy Pter 29 / 62

  • Bevezets a wxPythonba

    7. Grafikus elemek manipullsa

    A wxPython absztrakcis rtegeket hasznl a grafikus elemek manipullsra. A legprimerebb absztrakcis rteget Device Context-nek nevezik. Egy class-rl van sz, ami metdusokat szolgltat olyan perifrikra val rajzolshoz, mint amilyen a kperny, a nyomtat, stb.

    7.1. Hogyan tltnk be egy kpet

    A wxPythonos kpmanipulcik kt class-t hvnak, ezek a wx.Image s wx.Bitmap. Az els platformfggetlen, mg a msodik platformfgg. A gyakorlatban ez azt jelenti, hogy a manipulcik a wx.Image segtsgvel trtnnek s a wx.Bitmap a kpeknek a kpernyre trtn kirsval foglalkozik.

    Egy kp betlthet a wx.Image konstruktornak hvsval :

    wx.Image (name, type=wx.BITMAP_TYPE_ANY, index=-1)

    A name paramter a betltend kpfile neve, a type paramter a kp tpusa (lsd az albbi tblzatot) s ha a fjl tbb kpet tartalmaz (ez lehet a helyzet pldul a GIF file-ok esetben), az index paramterrel lehet meghatrozni a kpet.

    A kvetkez, kornt sem kimert tblzat nhny tmogatott kpformtumot sorol fel :

    type (flag) Lers

    wx.BITMAP_TYPE_JPEGJPEG tpus kp

    wx.BITMAP_TYPE_GIFGIF tpus kp

    wx.BITMAP_TYPE_PNGPNG tpus kp

    wx.BITMAP_TYPE_ICOWindows ikonok formtuma

    wx.BITMAP_TYPE_TIFTIFF tpus kp

    wx.BITMAP_TYPE_ANYA wxPython megksrli automatikusan detektlni a kp tpust

    Copyright 2006 Jeremy Berthet & Gilles Doge 30 / 62

  • Bevezets a wxPythonba

    7.2. Kpmanipulci

    A wx.Image class klnbz kpmveleteket knl. A kvetkez tblzat a leggyakrabban vgzett mveleteket sorolja fel :

    Metdus Lers

    Rescale(width, height) A width s height j rtkvel vltoztatja meg a kp mrett.

    Rotate(angle,

    rotationCentre,

    interpolating=True,

    offsetAfterRotation=None)

    A rotationCentre centrumhoz (egy wx.Point) kppest angle radin szggel vgrehajtott forgats utn egy j wx.Image objektum a visszatrsi rtke. Egy hosszabb, de pontosabb algoritmust hasznl, ha az interpolating rtke True.

    Rotate90(clockwise=True) 90 -kal elforgatja a kpet. Ha a paramter rtke True, akkor az ramutat jrsnak megfelel irnyba forgat.

    Scale(width, height) Visszatrsi rtke a kp msolata, miutn width s height mretre vltoztatta a kp mreteit.

    Mirror(horizontally=True) Egy wx.Image objektum a visszatrsi rtke. A kp a vzszintes tengelyre van tkrzve (ha a paramter rtke True), vagy a fggleges tengelyre, (ha a paramter rtke False). Az eredeti kpet nem mdostja.

    Replace(r1, g1, b1, r2, g2, b2) Mindegyik pixelt, amelyiknek a szne (r1, g1, b1) az (r2, g2, b2) sznnel helyettesti.

    Tudjon rla az olvas, hogy egy maszkot alkalmazva (SetMaskColor() metdus) jtszani lehet a kpek tltszsgval, vagy jtszani lehet a pixelek alfa-rtkvel.

    Itt nem fogunk belemenni ebbe a tmba, viszont az olvas tovbbi informcikat fog tallni a tmrl a wxPython wiki-ben (http://wiki.wxpython.org/index.cgi/WorkingWithImages) valamint az API dokumentcijban (http://www.wxpython.org/docs/api/frames.html).

    Copyright Hungarian Translation 2008 Darczy Pter 31 / 62

  • Bevezets a wxPythonba

    8. Menk

    A wxPython a a menket hrom class segtsgvel kezeli :

    wx.MenuBar : magnak a mensvnak a kezelsvel foglalkozik wx.Menu : az egyes menk (pl.: File men) vagy almenk kezelsre val wx.MenuItem : egy menpontot reprezentl

    A mengenerls ht lpsben foglalhat ssze :

    1. A mensv ltrehozsa

    2. A mensv hozzkapcsolsa egy frame-hez

    3. Az egyes menk ltrehozsa

    4. Ezeknek a menknek a hozzkapcsolsa a mensvhoz vagy egy szlmenhz

    5. A menelemek (menpontok) ltrehozsa

    6. A menelemek hozzkapcsolsa a megfelel menhz

    7. Minden menelemmel (menponttal) sszektnk egy akcit

    Az elbb lert lpsek vgrehajtsnak sorrendje rugalmas s vltozhat. Minden esetre egy men krelsa sorn automatikusan vgigmegynk a fnti 7 lpsbl ll mveletsoron.

    8.1. Mensv ltrehozsa

    Egy mensv generlsa a wx.MenuBar konstruktorval trtnik, aminek nincs paramtere.

    A mensv egy frame-hez trtn kapcsolshoz a wx.Frame SetMenuBar(menubar) metdust kell hvni.

    menubar = wx.MenuBar()self.SetMenuBar(menubar)

    8.2. Menk ltrehozsa

    A legrdl menk generlsa a wx.Menu() konstruktorral trtnik :

    wx.Menu(title="", style=0)

    A menk szmra csak egy stlus lehetsges s azt csak a GTK tmogatja. A wx.MENU_TEAROFF stlusrl van sz, ami lehetv teszi a men levlasztst a mensvrl annak rdekben, hogy az elbbi autonm mdon legyen hasznlhat. A title paramter titok marad, nem fogjuk hasznlni a pldinkban.

    Copyright 2006 Jeremy Berthet & Gilles Doge 32 / 62

  • Bevezets a wxPythonba

    8.3. Egy men hozzkapcsolsa/trlse a mensorhoz/bl

    A wx.MenuBar -nak hrom a mensv meninek kezelsre val rdekes metdusa van.

    Metdus Lers

    Append(menu, title) A paramterben tadott ment hozzadja a mensvhoz s egy kzs nevet asszocil hozz.

    Insert(pos, menu, title) A paramterben tadott ment beszrja a mensvba a pos pozciba.

    Remove(pos) Trli a pos pozciban lv ment.

    8.4. Menpontok hozzadsa a menhz

    A menpontok hozzadsnak vonatkozsban klnbz megkzeltsek vannak (pldul a Quit menpont hozzadsa a File menhz).

    A legtmrebb mdszer a wx.Menu Append() metdusnak alkalmazsa :

    Append ( id, text, helpStr="", kind=wx.ITEM_NORMAL )

    Az id paramter egy wxPython ID. A text paramter egy karakterlnc, ami majd ki lesz rva a menben ( mint a menpont neve ). Ha a helpStr argumentum definilva van s a frame tartalmaz egy sttussvot, akkor a helpStr a sttussvban fog kirdni amikor a menpontot kiemeljk. Ez a metdus a men vghez ad egy menpontot egy implicit wx.MenuItem objektum generlsval.

    A wx.Menu AppendSeparator() metdusval elvlaszt szakaszokat adhatunk a menhz.

    Alkalmazsi plda :

    mnuFichier = wx.Menu()itemNouveau = mnuFichier.Append (wx.ID_ANY, "Nouveau")mnuFichier.AppendSeparator()itemQuitter = mnuFichier.Append (wx.ID_ANY, "&Quitter")# notez le '&' pour crer un accs mnmonique sur le 'Q'

    A menpontok hozzadsnak egy msik megkzeltse az, hogy a menpontokat a (wx.MenuItem() konstruktorral) explicit mdon hozzuk ltre, majd hozzkapcsoljuk a menhz. A menpontokat generl konstruktor a kvetkez alak :

    wx.MenuItem(parentMenu=None, id=wx.ID_ANY, text="", helpStr="", kind=wx.ITEM_NORMAL, subMenu=None)

    A parentMenu paramter a menpont szlmenjt reprezentlja s a wx.Menu class egy objektumnak kell lennie. A szl megadsnak tnye nem fogja automatikusan elidzni a menpont menhz val hozzkapcsolst. Ezt az AppendItem() metdussal explicit mdon kell megtenni ! A subMenu paramter megadsval lehetsgnk van ennek a menpontnak almenv val talaktsra. Mi minden esetre azt tancsoljuk az olvasnak, hogy ne hasznlja ezt a mdszert,

    Copyright Hungarian Translation 2008 Darczy Pter 33 / 62

  • Bevezets a wxPythonba

    hanem alkalmazza ennek a fejezetnek az "Almenk" alfejezetben bemutatott megkzeltst.Egy msik mdszer ugyanennek az eredmnynek az elrshez :

    mnuFichier = wx.Menu()itemNouveau = wx.MenuItem(mnuFichier, wx.ID_ANY, "Nouveau")itemQuitter = wx.MenuItem(mnuFichier, wx.ID_ANY, "&Quitter")mnuFichier.AppendItem(itemNouveau)mnuFichier.AppendSeparator()mnuFichier.AppendItem(itemQuitter)

    8.5. Menesemny kezelse

    Egy akcinak egy menponthoz kapcsolsa emlkeztet arra, ahogy egy gombhoz kapcsolunk akcit. Az elv ugyanaz, a Bind() metdust kell alkalmazni a mensvot tartalmaz frame-re a wx.EVT_MENU esemnnyel.

    self.Bind(wx.EVT_MENU, self.OnQuitter, itemQuitter)

    Ahol : self a frame, self.OnExit a hvand metdus s itemQuitter a menpont.

    8.6. Gyorstbillentk (short cut) s mnemonikus hozzfrs

    Mnemonikus billentyk kapcsolhatk a menpontokhoz gy, hogy a kirand szveg ltalunk kivlasztott betje el egy & jelet runk. Pldul ahhoz, hogy az "Enregistrer sous..." 'n'-jhez mnemonikus hozzfrst kapcsoljunk, "E&nregistrer sous..." -t kell rnunk.

    Ugyangy, ltezik egy egyszer mdszer arra, hogy egy menponthoz gyorstbillentyt kapcsoljunk. Ehhez elg belevenni a billenty kombincit a menpont szvegbe. A szveg vghez hooz kell rni a \t tabulcis karaktert s ezt kell kvetni a billenty kombincinak. Ez a kombinci kezddhet a Ctrl, Alt vagy Shift mdostbillentykkel, utna jhet a '+' vagy '-' elvlaszt majd a kvnt karakter kvetkezik.

    Egy plda vilgosabb fogja tenni az elmondottakat : a Ctrl+S gyorstbillentyt akarjuk hozzrendelni az "Enregistrer" menponthoz, teht elegend "Enregistrer\tCtrl+S" (vagy "Enregistrer\tCtrl-S") -t rni. A mdostbillentyket kombinlni lehet. Pl.: "Enregistrer Sous\tCtrl+Shit+S".

    MacOS X alatt a Ctrl mdostbillenty a Command (Apple) billentyt reprezentlja.

    itemSauveSous = mnuFichier.Append(wx.ID_ANY, "E&nregistrer Sous...\tCtrl-Shit-S")

    Copyright 2006 Jeremy Berthet & Gilles Doge 34 / 62

  • Bevezets a wxPythonba

    8.7. Almenk

    Almenk hozzadshoz a wx.Menu class az AppendMenu() metdust knlja. Prototpusa :

    itemSauveSous = mnuFichier.Append(wx.ID_ANY, "E&nregistrer Sous...\tCtrl-Shit-S")

    Tekintsnk egy pldt :

    menubar = wx.MenuBar()menu = wx.Menu()sousmenu = wx.Menu()item1 = sousmenu.Append(wx.ID_ANY, "Element sous-menu 1")item2 = sousmenu.Append(wx.ID_ANY, "Element sous-menu 2")# ajout du sous menu au menumenu.AppendMenu(wx.ID_ANY, "Sous-menu", sousmenu)itemQuitter = menu.Append(wx.ID_ANY, "Quitter")menubar.Append (menu, "Menu")self.SetMenuBar(menubar)

    Copyright Hungarian Translation 2008 Darczy Pter 35 / 62

  • Bevezets a wxPythonba

    9. Kvetkeztets

    Befejezsl : remljk az olvasnak sikerlt ltalnos rltst szerezni a wxPythonra s funkciira.

    Tudatban vagyunk annak, hogy sok mindennel nem foglalkoztunk. A wxPythonnak van angol nyelv bibliogrfija, tovbb rendelkezsnkre ll a "wxPython in action" [1] cm kivl knyv.

    Radsul a wxPython kzssg nagyon aktv s a wikiben szmos komplett s magyarzatokkal jl elltott pldt tallunk. A kzssg eszkzket is fejleszt : mint az interface-fejleszt, ami a fejleszts vgs stdiumban van. Br nem beszltnk rluk ebben a jegyzetben, de javasoljuk az olvasnak, hogy vessen egy pillantst a Glade s a BoaConstructor alkalmazsokra.

    Copyright 2006 Jeremy Berthet & Gilles Doge 36 / 62

  • Bevezets a wxPythonba

    10. Bibliogrfia

    [1] wxPython in action, Noel Rappin et Robin Dunn, editions Manning 2006

    [2] Site wxPython.org, http://www.wxpython.org

    [3] Site wxWidgets.org, http://www.wxwidgets.org

    [4] Wiki wxPython, http://wiki.wxpython.org

    [5] Site MacPython, "Jack", http://homepages.cwi.nl/~jack/macpython

    Copyright Hungarian Translation 2008 Darczy Pter 37 / 62

  • Bevezets a wxPythonba

    11. A pldk forrskdja

    11.1. Hello World (hello.py)

    #! /usr/bin/pythonw # -*- coding: utf-8 -*- import wx

    class MainApp(wx.App): """ A wxPython ltal felknlt Application class-bl generljuk az alkalmazst. Figyelem: A "constructor" egy kicsit specilis !""" def OnInit(self): # A fablak generlsa frame = MainWindow('Hello World !') self.SetTopWindow(frame) return True

    class MainWindow(wx.Frame): """ Egy - az alkalmazsunkra adaptlt ablak generlsa. A wxPython ltal felknlt alap ablak-class Ezrt szrmaztattuk le az ablakunkat a wxPython ltal felknlt alap ablak- class-bl.. """ def __init__(self, title): wx.Frame.__init__(self, None, wx.ID_ANY, title) self.Show(True)

    if __name__ == "__main__": app = MainApp() app.MainLoop()

    Copyright 2006 Jeremy Berthet & Gilles Doge 38 / 62

  • Bevezets a wxPythonba

    11.2. Plda egyszer esemny kezelsre (goodbye.py)

    #! /usr/bin/pythonw # -*- coding: utf-8 -*- import wx

    class MainApp(wx.App): """ A wxPython ltal felknlt application class-bl leszrmaztatott alkalmazs generlsa. Figyelem: A "constructor" egy kicsit specilis !""" def OnInit(self): # A fablak generlsa frame = MainWindow('Hello World !') self.SetTopWindow(frame) return True

    class MainWindow(wx.Frame): """ Egy - az alkalmazsunkra adaptlt ablak generlsa. A wxPython ltal felknlt alap ablak-class Ezrt szrmaztattuk le az ablakunkat a wxPython ltal felknlt alap ablak -class-bl... """ def __init__(self, title): """ Itt vltozs van. A frame mrett s a stlust adjuk meg. A kifejezs azt jelenti, hogy hasznljuk az alaprtelmezett ablakstlust s abbl vegyk ki (^ opertor) az ablak tmretezsnek lehetsgt s a cmsor hrom gombjt. Cette expression dit d'utiliser le style par dfaut des fentres et de retirer (oprateur ^) la possibilit de redimensionner la fentre ainsi que les trois boutons de la barre de titre """ wx.Frame.__init__(self, None, wx.ID_ANY, title, size=(300, 100), style=wx.DEFAULT_FRAME_STYLE ^ ( wx.RESIZE_BORDER | wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.CLOSE_BOX) ) # Egy widget-kontnert teszunk a frame-be panel = wx.Panel(self, wx.ID_ANY) # Egy gombot teszunk a kontnerbe egy kivlasztott pozciba self.button = wx.Button(panel, wx.ID_ANY, "Good bye !", pos=(100, 30)) # A button objektum EVT_BUTTON esemnyhez hozzrendeljuk az OnClick metdust self.Bind(wx.EVT_BUTTON, self.OnClick, self.button) self.Show(True)

    def OnClick(self, event): #wx.Exit() self.Close()

    if __name__ == "__main__": app = MainApp() app.MainLoop()

    Copyright Hungarian Translation 2008 Darczy Pter 39 / 62

  • Bevezets a wxPythonba

    11.3. Dialogbox-ok (dialog.py)

    #! /usr/bin/pythonw # -*- coding: utf-8 -*- import wx

    class MainApp(wx.App): """ A wxPython ltal felknlt application class-bl leszrmaztatott alkalmazs generlsa.""" def OnInit(self): # A fablak generlsa frame = MainWindow('Prbeszddoboz') self.SetTopWindow(frame) return True

    def OnExit(self): """ Az alkalmazsbl trtn kilps eltt automatikusan hvott metdus"""

    # Egy egyszeru prbeszddoboz objektum generlsa dialogue = wx.MessageDialog(None, 'GoodBye!', "message d'au revoir", wx.OK)

    # a prbeszddoboz kiratsa result = dialogue.ShowModal() return True

    class MainWindow(wx.Frame): """ Egy - az alkalmazsunkra adaptlt ablak generlsa. A wxPython ltal felknlt alap ablak-class Ezrt szrmaztattuk le az ablakunkat a wxPython ltal felknlt alap ablak- class-bl..."""

    def __init__(self, title): # Itt vltozs van. A frame mrett adjuk meg. wx.Frame.__init__(self, None, wx.ID_ANY, title, size=(300, 150))

    # Egy widget-kontnert tesznk a frame-be self.panel = wx.Panel(self, wx.ID_ANY)

    # Sizer a gombok elhelyezshez sizer = wx.GridBagSizer(5,5)

    # Gombok elhelyezse a kontnerbe btnDialog = wx.Button(self.panel, wx.ID_ANY, "Egyszer prbeszddoboz", size=(290, 35)) btnSaisie = wx.Button(self.panel, wx.ID_ANY, "Prbeszddoboz adatberssal", size=(290, 35)) btnChoix1 = wx.Button(self.panel, wx.ID_ANY, "Prbeszddoboz egyszeres vlasztssal", size=(290, 35)) btnChoix2 = wx.Button(self.panel, wx.ID_ANY, "Prbeszddoboz tbbszrs vlasztssal", size=(290, 35)) btnChoix3 = wx.Button(self.panel, wx.ID_ANY, "Egy szn kivlasztsa", size=(290, 35)) btnExit = wx.Button(self.panel, wx.ID_ANY, "&Kilps")

    # Sizer hozzadsa sizer.Add(btnDialog, (0,0), flag=wx.ALIGN_CENTER|wx.EXPAND|wx.ALL, border=5) sizer.Add(btnSaisie, (1,0), flag=wx.ALIGN_CENTER|wx.EXPAND|wx.ALL, border=5) sizer.Add(btnChoix1, (2,0), flag=wx.ALIGN_CENTER|wx.EXPAND|wx.ALL, border=5) sizer.Add(btnChoix2, (3,0), flag=wx.ALIGN_CENTER|wx.EXPAND|wx.ALL, border=5)

    Copyright 2006 Jeremy Berthet & Gilles Doge 40 / 62

  • Bevezets a wxPythonba

    sizer.Add(btnChoix3, (4,0), flag=wx.ALIGN_CENTER|wx.EXPAND|wx.ALL, border=5) sizer.Add(btnExit, (5,1), flag=wx.ALIGN_BOTTOM|wx.ALIGN_RIGHT)

    sizer.Add((10,10), pos=(6,0), span=(1, 3)) # als marg sizer.Add((10,10), pos=(0,2), span=(5, 1)) # jobboldali marg

    sizer.AddGrowableRow(5) sizer.AddGrowableCol(0) sizer.AddGrowableCol(1)

    self.panel.SetSizer(sizer) sizer.Fit(self)

    # Metdusok hozzrendelse a gombra trtn kattintshoz self.Bind(wx.EVT_BUTTON, self.AfficherDlgSimple, btnDialog) self.Bind(wx.EVT_BUTTON, self.AfficherDlgSaisie, btnSaisie) self.Bind(wx.EVT_BUTTON, self.AfficherDlgChoixUnique, btnChoix1) self.Bind(wx.EVT_BUTTON, self.AfficherDlgChoixMulti, btnChoix2) self.Bind(wx.EVT_BUTTON, self.AfficherDlgCouleur, btnChoix3) self.Bind(wx.EVT_BUTTON, self.Quitter, btnExit) self.SetMinSize((300, 150)) self.Show(True)

    def Quitter(self, source): self.Close()

    def AfficherDlgSimple(self, source): """ Egyszer prbeszddoboz kiratsa """ dlgMsg = wx.MessageDialog(None, 'Szereti ezt a pldt ?', 'Krds', wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION) reponse = dlgMsg.ShowModal() if reponse == wx.ID_YES: message = 'Klassz !' else: message = 'Oh, nem!' wx.MessageDialog(self, message, style=wx.OK).ShowModal() dlgMsg.Destroy()

    def AfficherDlgSaisie(self, source): """Adatbersos prbeszddoboz kiratsa """ dlgSaisie = wx.TextEntryDialog(self, 'rja be a keresztnevt', 'Szemlyes krds', 'ide rja be a szveget', style=wx.OK|wx.CANCEL) # Prbeszddoboz kiratsa + a visszatrsi rtk kinyerse reponse = dlgSaisie.ShowModal() if reponse == wx.ID_OK: prenom = dlgSaisie.GetValue() wx.MessageDialog(None, 'Bonjour ' + prenom, style=wx.OK).ShowModal() dlgSaisie.Destroy()

    def AfficherDlgChoixUnique(self, source): """ Egyszeres kivlaszts prbeszddoboz kiratsa """ dlgMulti = wx.SingleChoiceDialog(self, 'Melyik a kedvenc gymlcse ?', 'Egyszeres vlaszts', [u'szibarack', u'alma', u'srgabarack', u'gesztenye', u'szilva']) if dlgMulti.ShowModal() == wx.ID_OK: fruit = dlgMulti.GetStringSelection() wx.MessageDialog(None,

    Copyright Hungarian Translation 2008 Darczy Pter 41 / 62

  • Bevezets a wxPythonba

    u'Egy ' + fruit + u'torta kszl', 'Mi kszl', style=wx.OK).ShowModal() dlgMulti.Destroy()

    def AfficherDlgChoixMulti(self, source): """ Tbbszrs kivlaszts prbeszddoboz kiratsa """ fruits = [u'szibarack', u'alma', u'srgabarack', u'gesztenye', u'szilva'] dlgMulti = wx.MultiChoiceDialog(self, 'Melyek a kedvenc gymlcsei ?', 'Tbbszrs vlaszts', fruits)

    if dlgMulti.ShowModal() == wx.ID_OK: # a kivlasztott elemek kinyerse egy indexlista formjban listeFruits = u"" for i in dlgMulti.GetSelections(): listeFruits = listeFruits + fruits[i] + u", " wx.MessageDialog(None, u"ppen egy " + listeFruits + u" torta kszl...", style=wx.OK).ShowModal() dlgMulti.Destroy()

    def AfficherDlgCouleur(self, source): """ A ColourDialog kiratsa """ dlgCouleur = wx.ColourDialog(self) res = dlgCouleur.ShowModal() if res == wx.ID_OK: # a DataColour kinyerse couleur = dlgCouleur.GetColourData() # a panel htternek sznezse a kivlasztott sznnel self.panel.SetBackgroundColour(couleur.GetColour()) dlgCouleur.Destroy()

    if __name__ == "__main__": app = MainApp(redirect=False) app.MainLoop()

    Copyright 2006 Jeremy Berthet & Gilles Doge 42 / 62

  • Bevezets a wxPythonba

    11.4. Plda a GridSizer hasznlatra (gridsizer.py)

    #! /usr/bin/pythonw # -*- coding: utf-8 -*- import wx

    # A gombok neveinek listja labels = "un deux trois quatre cinq six sept huit neuf".split()

    class MainApp(wx.App): def OnInit(self): # A fablak generlsa frame = MainWindow('GridSizer') self.SetTopWindow(frame) return True

    class MainWindow(wx.Frame): """Ablak a Grid sizer bemutatshoz. """

    def __init__(self, title): wx.Frame.__init__(self, None, wx.ID_ANY, title=title, size=(300, 150))

    # Egy panel ltrehozsa self.panel = wx.Panel(self);

    # A grid sizer ltrehozsa self.sizer = wx.GridSizer(rows=3, cols=3, hgap=2, vgap=2)

    # Gombok ltrehozsa s hozzadsa a sizer-hez for label in labels: # Ebben a pldban semmilyen akcit sem rendelnk a gombokhoz. btn = wx.Button(self.panel, wx.ID_ANY, label); self.sizer.Add(btn, 0, 0)

    # A sizer-t a panelhez kapcsoljuk self.panel.SetSizer(self.sizer) # Belltja a sizer mrett self.sizer.Fit(self) # Az ablak minimlis mretnek definilsa self.SetMinSize((300, 150))

    # Az ablak megjelentse self.Show(True)

    if __name__ == "__main__": app = MainApp(redirect=False) # Arra val, hogy a standard kimeneti stream-et # ne a grafikus ablakba irnytsuk # (debug-olshoz hasznos) app.MainLoop()

    Copyright Hungarian Translation 2008 Darczy Pter 43 / 62

  • Bevezets a wxPythonba

    11.5. Plda a FlexGridSizer hasznlatra (flexgridsizer.py)

    #! /usr/bin/pythonw # -*- coding: utf-8 -*- import wx

    # A gombok neveinek listja labels = "un deux trois quatre cinq six sept huit neuf dix onze douze".split() couleurs = ["red", "gray", "sky blue"]

    class MainWindow(wx.Frame): """Ablak a Flex Grid sizer bemutatshoz. """

    def __init__(self, title): wx.Frame.__init__(self, None, wx.ID_ANY, title=title, size=(300, 120))

    # A grid sizer ltrehozsa sizer = wx.FlexGridSizer(rows=4, cols=3, hgap=2, vgap=2) i=0 # panelek ltrehozsa s hozzadsa a sizer-hez for label in labels: panel = PanelColore(self, wx.ID_ANY, label, couleurs[i%len(couleurs)]); sizer.Add(panel, 0, wx.EXPAND) # wx.EXPAND lehetv mteszi a panel # mretnek vltoztatst i=i+1

    sizer.AddGrowableCol(2) # a 3. oszlopot mretvltoztatv sizer.AddGrowableRow(1) # a 2. sort mretvltoztatv teszi sizer.AddGrowableRow(3) # a 4. sort mretvltoztatv teszi

    # a sizer-t a frame-hez kapcsolja self.SetSizer(sizer) # belltja a sizer mrett self.Fit() # az ablak minimlis mretnek definilsa self.SetMinSize((300, 120)) # az ablak megjelentse self.Show(True)

    class PanelColore (wx.Panel): """ Panel httrsznnel annak rdekben, hogy jl megklnbztethessk a sizer-ek klnbz belltsait." ""

    def __init__(self, parent, ID=wx.ID_ANY, label="", color="white", pos=wx.DefaultPosition, size=(100, 30)):

    wx.Panel.__init__(self, parent, ID, pos, size, name=label) self.label=label self.SetBackgroundColour(color); self.SetMinSize(size) self.Bind(wx.EVT_PAINT, self.OnPaint)

    def OnPaint(self, event): size = self.GetSize() # panel mretnek kinyerse dc = wx.PaintDC(self) # a grafikus kontextus kinyerse # (DC = Device Context) # a szlessg s a magassg kinyerse, amit a kirand szveg fog felvenni w,h = dc.GetTextExtent(self.label) # a szveg kirajzolsa a panelbe dc.DrawText(self.label, (size.width-w)/2, (size.height-h)/2)

    Copyright 2006 Jeremy Berthet & Gilles Doge 44 / 62

  • Bevezets a wxPythonba

    class MainApp(wx.App): def OnInit(self): # A fablak generlsa frame = MainWindow('FlexGridSizer') self.SetTopWindow(frame) return True

    if __name__ == "__main__": app = MainApp(redirect=False) # Arra val, hogy a standard kimeneti stream-et # ne a grafikus ablakba irnytsuk # (debug-olshoz hasznos) app.MainLoop()

    Copyright Hungarian Translation 2008 Darczy Pter 45 / 62

  • Bevezets a wxPythonba

    11.6. Plda a GridBagSizer hasznlatra (gridbagsizer.py)

    #! /usr/bin/pythonw # -*- coding: utf-8 -*- import wx

    # A gombok neveinek listja couleurs = ["red", "gray"] # A gombok neveinek listja labels = "un deux trois quatre cinq six".split()

    class MainWindow(wx.Frame): """Ablak a Grid Bag sizer bemutatshoz. """

    def __init__(self, title): wx.Frame.__init__(self, None, wx.ID_ANY, size=(400, 120))

    # A grid bag sizer ltrehozsa sizer = wx.GridBagSizer(hgap=2, vgap=2)

    # 6 panel ltrehozsa s a sizer-hez kapcsolsuk for colonne in [0, 1]: for ligne in range(3): panel = PanelColore(self, wx.ID_ANY, labels[colonne + ligne*2], couleurs[colonne]); sizer.Add(panel, pos=(ligne