Régóta szerves része a Pythonnak egy platform független ablakozós eszközkészlet, ami a Tkinter modul - és ennek kibővítse, a Tix modul - használatával érhető el. (A Tix modul bemutatása nem része ezen lapnak.)
Tkinter olyan dolgok halmaza, ami implementálja a Tk widgeteket, mint Python-osztályokat.
Nem a Tk az egyetlen GUI-ja a Pythonnak, de ez a leggyakraban használt.
Először nézzük, hogyan tudunk egy egyszerű Hello World programot írni.
# Ha „import Tkinter” –t használnánk, akkor máshogy tudnánk # használni a függvényeket, erre látunk is
Nagyobb programoknál természetesen osztályokba foglaljuk a kódot. Erre jó példa a következő:
# File: hello2.py
Azt, hogy különböző vezérlőelemek (szövegdoboz, nyomógomb, checkbox, ...) hogyan helyezkedjenek el egy ablakban, különböző módon adhatjuk meg. A geometriai kezelők relatív helyzetet specifikálnak a tartalmazó objektumukban (Ez nem biztos, hogy egy ablak, ablakon belül elhelyezhetünk például frame-eket is, ekkor a frame-en belüli helyét adja meg).
Fontos megjegyezni, hogy a létrehozott vezérlőelemek nem jelennek meg amikor létrehozzuk, csak akkor, amikor megadjuk a helyét!
Jól specifikálja a pontos koordinátákat, a felül(above), balra (to the left), kitöltve(filling) kifejezések használatával. Meghatározható az ablakok mérete is. Különböző dolgokat frame-ekbe tehetünk a szép kinézet érdekében.
A pack() metódus meghívásával tudjuk megadni a helyzetét az vezérlőelemnek. Defaultból legfelülre kerül.
pl.:
Ennek eredménye: piros háttéren kiírva, hogy „hello vilag”, vízszintesen töltött, alulra igazított 15 magas kiírás. Az ablak teteje fehér.
A pack() további tulajdonságainak megadása a következő paraméterekkel lehetséges:
Név |
Leírás |
Expand |
lehetséges értékei: 0(alapértelmezett) vagy 1 vagy "true" vagy "false" ;kiterjedjen-e úgy a vezérlőelem, hogy kitöltse az összes rendelkezésre álló helyet |
Fill |
lehetséges értékek: 'x', 'y', 'both', 'none'(alapértelmezett); kitöltse-e a vezérlőelem a szülő ablak vagy a vezérlőelem által biztosított teljes helyet. |
Side |
lehetséges értékei: 'left', 'right', 'top'(alapértelmezett), 'bottom'; a vezérlőelem a rendelkezésre álló helyen hol helyezkedjen el |
ipadx és ipady |
a vezérlőelem által elfoglalt hely nagysága belül |
padx és pady |
a vezérlőelem által elfoglalt hely nagysága kívül |
Bővebben a referenciában.
A szülő ablakot vagy a vezérlőelemet egy kétdimenziós táblázat soraiba (row) illetve oszlopaiba (column) teszi.
pl.
Tulajdonságok:
A .grid() eljárás
Egy w vezérlőelem megjelenítése:
Ez az eljárás egy w vezérlőelemet regisztrál a grid geometriai kezelővel. Enélkül a vezérlőelem csak belül létezik.
A grid() geometriai kezelő opciói:
Column |
Annak az oszlopnak a száma, ahova a vezérlőelemet tenni akarod, nullától számolva. Az alapértelmezett értéke 0. |
columnspan |
Általában egy vezérlőelem csak egy cellát foglal el a rácsban. Azonban egy sor több celláját is tehetjük egy nagyobb cellába úgy, hogy a columnspan opciónak az egyesítendő cellák számát adjuk meg. Például, w.grid(row=0, column=2, columnspan=3) a w vezérlőelemet a 0-adik sorba, a 2-es, 3-as és 4-es oszlopok által kifeszített cellába teszi. |
Ipadx |
x kitöltése belül. |
Ipady |
y kitöltése belül |
Padx |
x kitöltése kívül |
Pady |
y kitöltése kívül |
Row |
Annak az sornak a száma, ahova a vezérlőelemet tenni akarod, nullától számolva. Az alapértelmezett érték a következő, nem foglalt sor sorszáma |
Rowspan |
Ugyanaz, mint a columnspan, csak sorokra |
Sticky |
Ez az opció azt határozza meg, hogyan osszunk fel bármely más helyet a cellán belül, ami a vezérlőelem természetes méretével nem meghatározott |
Hacsak nem használunk adott méreteket, egy adott vezérlőelem szélessége egy oszlopon belül a legszélesebb cella szélességével lesz egyenlő, és a magassága egy sornak a legnagyobb sornak a magassága lesz. Egy vezérlőelem sticky attribútuma csak akkor szabályoz, ha olyan helyre kerül, ahova nem passzol pontosan.
Ha felül szeretnénk írni a soroknak és az oszlopoknak ezt az automatikus méretezését, ezeket a függvényeket használhatjuk a szülő vezérlőelemnél:
A w vezérlőelemet tartalmazó grid elrendezésében, az N oszlop konfigurálása úgy, hogy az adott opció a megadott értéket veszi fel.
A w vezérlőelemet tartalmazó grid elrendezésében, az N oszlop konfigurálása úgy, hogy az adott opció a megadott értéket veszi fel.
A következő opciók használhatók az oszlopok és a sorok konfigurálásához:
minsize |
Az oszlopnak vagy a sornak a minimális mérete pixelekben. Ha nincs semmi az adott oszlopban vagy sorban, akkor még akkor sem jelenik meg, ha használjuk ezt az opciót |
pad |
Azon pixelek száma, amit az adott sorhoz vagy oszlophoz adunk, a legnagyobb cellán felül a sorban vagy oszlopban |
weight |
Egy oszlopnak vagy sornak a rugalmasságát állíthatjuk be ezzel az opcióval, egy olyan értéket megadva, ami ennek az oszlopnak vagy sornak a relatív súlyát adja, az extra helyek elosztásánál. Például, ha egy w vezérlőelem egy grid elrendezést tartalmaz, akkor ezek a sorok az extra helyek háromnegyedét az első oszlophoz osztják, míg az egynegyedét a második oszlophoz: w.columnconfigure(0, weight=3) w.columnconfigure(1, weight=1) Ezen opció használata nélkül, az oszlop vagy a sor nem lesz kinyújtva. |
Ennek eléréséhez az előbb leírt sor és oszlop méret kezelésénél használt technikákat kell használni. Ez azonban nem elegendő.
Tekintsük a következő programot:
Ez csupán egy Quit gombot tartalmaz. Ezt az alkalmazást futtatva, majd átméretezve az ablakot, azt kapjuk, hogy a gomb ugyanabban a méretben marad az ablak közepén.
A .__createWidgets() eljárást egy kicsit átírva már a gomb mindig kitölti a rendelkezésére álló teret.
Egy további módosítást szükséges még megtenni. A konstruktor a második sorát kell átírni.
A helyet a szülőablakhoz vagy a vezérlőelemhez képest abszolút vagy relatív hivatkozással adjuk meg. Az abszolút megadásnál az x és az y, míg a relatív megadásnál a relx és a rely paramétereket használjuk. (Megj.: a relatív hivatkozásnál a bal ill. jobb szél, felső il. alsó rész a 0.0 és 1.0)
Arra használhatók, hogy az ablakban lévő értéket megkapjuk.
Sok hasznos alosztálya van a Variable osztálynak: StringVar, IntVar, DoubleVar és BooleanVar. Egy változó jelenlegi értékét megkaphatjuk a get() függvénnyel, míg az értékének megváltoztatásához a set() -et használjuk.
pl.:
Ablak tulajdonságainak kezelésére - mint például ablak címének meghatározása, elhelyezése, stb. - van egy ún. wm parancs. Tkinter modulban ezek a parancsok metódusként vannak implementálva a Wm osztályban. Az elsődleges vezérlőeleme a Wm osztály alosztályai, így a Wm-beli metódusokat közvetlenül lehet hívni.
pl.:
Widget |
Leírás |
Button |
Egyszerű nyomógomb,egy parancsot végrehajtására vagy más műveletre |
Canvas |
Gráfok és pontok rajzolására, grafikus szerkesztő létrehozására |
Checkbutton |
Érték bejelölésére használható |
Entry |
Adatbeviteli mező |
Frame |
Gyűjtő(container); más vezérlőelemek összefogására, alkalmazás vagy dialógusablak kinézetének szervezésére való; lehet szegélye és háttere |
Label |
Szöveg vagy kép elhelyezése |
Listbox |
Lehetséges értékek listája |
Menu |
Legördülő és felugró menü létrehozása |
Menubotton |
Legördülő menü létrehozása |
Message |
Szöveg elhelyezése; hasonló a labelhez, csak meghatározható a szélesség vagy az arány |
Radiobutton |
Egy érték meghatározása,ami több különböző értéket vehet fel |
Scale |
Numerikus érték beállítása csuszkával |
Scrollbar |
Cancas, Entry, Listbox és Text vezérlőelemeknél használható görgetősáv |
Text |
Formázott szöveg kiírása; támogatja a beágyazott képek és ablakok kiírásat is |
Toplevel |
Különálló szülőablakként jeleníti meg a gyűjtő (frame) ablakot |
Megj. Tkinter osztályban nincs hierarchia a Widget osztályok között.
Minden Tkinter osztálybeli vezérlőelemet egy alapszinten lehet formázni, mint például megadni a színét, betűtípusát stb.
Meghatározhatjuk a szöveg színét, a background és a foreground használatával. A színeket megadhatjuk egyszerűen a nevükkel, vagy RGB komponenseinek megadásával. (Másféle megadás is ismert, ezek részletezése túlmutat ezen dokumentum részletein.)
Az RGB-s alak a következő: #RRGGBB , ahol RR, GG, BB hexadecimális megfelelője a pirosnak, zöldnek és a kéknek. Íme egy példa, hogy csinálhatunk Tk szín specifikációt egy 3-asból
tk_rgb = "#%02x%02x%02x" % (128, 192, 200)
Többféleképen is megadhatjuk a betűtípust. Egyik fajtája, amikor a Font osztály által támogatott stílus opciók közül választunk. Lehetséges értékek:
Opció |
Típus |
Leírás |
Family |
string |
Betűtípus |
Size |
integer |
Betűméret |
Weight |
constant |
Betűvastagság (NORMAL vagy BOLD) |
Slant |
constant |
Dőlt (NORMAL vagy ITALIC) |
Underline |
flag |
Aláhúzás (1,0) |
Overstrike |
flag |
Áthúzás (1,0) |
Defaultból a sorok középre(CENTER) igazítottak, ezen a justify opcióval lehet változtatni. Lehetséges értékei: LEFT, RIGHT.
Egyéb lehetőségek:
Lehetőség van például az egér mozgásának, kattintásának vagy lenyomva tartásának figyelésére is.
Egy nyomógomb létrehozásához egy master-rel nevezett főablakban vagy frame-ben:
w = Button (master, option=value)
A konstruktor az új gomb objektummal tér vissza. Lehetséges opciók:
activebackground |
Háttér színe, amikor a gomb a kurzor alatt van. |
bd/borderwidth |
Határ szélessége pixelekben. Alapértelmezés:2 |
bg/ background |
háttérszín |
command |
Meghívandó függvény vagy metódus nyomógombra kattintáskor |
image |
Gombon megjelenő kép |
state |
Állapotai: DISABLED – szürkített gomb, irányíthatatlanná válik |
textvariable |
A StringVar() egy példánya, ami gombon lévő szöveggel van kapcsolatban. Ha a változó változik, akkor az új érték kerül a gombra |
További opciók a dokumentációban.
A canvas egy derékszögű terület arra, hogy képeket vagy más komplex alakzatokat rajzoljunk Ezen ábrákat, szöveget, vezérlőelemet vagy frame-et helyezhetünk el. A következő metódusokkal hozhatunk létre objektumokat a vásznon:
Egy Canvas objektum létrehozása:
w = Canvas ( master, option=value, ... )
A konstruktor az új vezérlőelemmel tér vissza. Használható opciók:
bd / borderwidth |
Szegély szélessége pixelekben |
bg / background |
Canvas háttérszíne |
closeenough |
Ez határozza meg, mennyire kell közelnek lennie egy objektumhoz az egérnek, annak érzékeléséhez |
confine |
Ha igaz az értéke ( ez
az alapértelmezett), akkor a scrollozási
területen (scrollregion) kívül
nem lehet scrollozni |
height |
A vászon nagysága (Y dimenzióban) |
scrollregion |
Egy (w, n, e, s) négyes, ami azt határozza meg, hogy a vászon mekkora területe scrollozható. w a bal oldal, n a tető, e a jobb oldal, és s a terület alja. |
width |
A vászon szélessége (X dimenzió) |
A többi tulajdonság megtalálható a dokumentációban.
Mivel a vászon nagyobb lehet, mint az ablakunk, és az ablakunkon görgetősávok vannak az egész vászon megtekintésére, minden vászonnak két koordináta rendszere van.
A megjelenítési lista az összes, a vásznon lévő objektum listájára utal, a háttértől az előtérig.
Ha két objektum fedi egymást, akkor az ,hogy a megjelenítési listában felül van az egyik, az azt jelenti, hogy az van az előtérhez közel, az fog megjelenni a fedett területen, és elfedi az alatta lévőt.
Amennyiben ugyanarra a helyre hozunk létre objektumot, mint ahol már volt, akkor alapértelmezetten a megjelenítési lista tetejére kerül az új objektum. A megjelenítési lista újra rendezhető.
A vásznon lévő objektum objektum ID-ja a konstruktor által visszaadott érték. Minden objektum ID érték egyszerű integer, és az az objektum ID egyedi egy vásznon belül.
A tag egy sztring, ami a vászon objektumaihoz kapcsolódik
A tag-eknek számos használata van. Például, ha egy térképet rajzolsz a vászonra, és szöveg objektumok vannak a folyók megnevezésére, minden olyan szöveg objektumhoz a „folyócímke” tag-et kapcsolhatjuk. Ez pedig lehetővé teszi, hogy minden objektumon, azzal a tag-gel, ugyanazt a műveletet hajtsuk végre, mint például a címke színének megváltoztatása.
A Canvas objektumai sokfajta metódust támogatnak. Ilyenek például:
A megfelelő metódusok pontos leírása a dokumentációban
Ez egy ék alakú darab az ellipszisből. Ennek speciális esetei a teljes ellipszis és így a teljes kör is. Körív létrehozása a C vásznon:
id = C.create_arc(x0,y0,x1,y1,option, …)
A konstruktor az új objektum ID-jét adja vissza.
Az (x0,y0) pont a bal felső, az (x1,y1) pont a jobb alsó sarka annak a téglalapnak, amibe az ellipszis illeszkedik. Számos lehetséges opció közül néhány:
extent |
A körszelet szélessége fokokban megadva. A szelet a start opciónál megadott szögnél kezdődik, és az óramutató járásával ellentétes irányban terjeszti ki a szöget az extent opciónál megadott szögig. |
start |
Ld. Extent |
fill |
Alapértelmezetten a körív belseje átlátszó. Bármilyen színre beállítható |
style |
Alapértelmezetten az egész darabot megrajzolja a sugarakkal együtt (ehhez a style=PIESLICE -t kell használni). Lehetőség van CHORD és ARC paraméter megadására, ezeket mutatja be az alábbi ábra: |
Egy vonal akármennyi szakaszt tartalmazhat, a végüknél összekötve, és mindegyik szakasz lehet egyenes, vagy görbe. A vonal létrehozása a C vásznon:
C.create_line(x0,y0,x1,y1, … , xn,yn, option, … )
A vonal az (x0,y0), (x1,y1), …, (xn, yn) pontok sorozatán halad át.
Megadható opciók:
arrow |
Alapértelmezetten a vonalak nem irányítottak. Az arrow=FIRST használatával az (x0,y0) pontba kapunk egy nyílfejet a vonal mentén. Az arrow= LAST a végéhez tesz nyilat, míg az arrow= BOTH mindkét oldalra kiteszi a nyilat |
fill |
Vonal színének beállítása |
smooth |
Amennyiben értéke igaz, akkor úgy rajzoljuk meg a vonalat, hogy ponthalmazra illeszkedő parabolikus spline-ok sorozatát rajzolunk. |
A többi objektum pontos leírása a dokumentációban megtalálható.
Amikor meghívjuk a Tk konstruktort, akkor automatikusan generálódik egy „gyoker” ablak. Ha további ablakokat szeretnénk létrehozni, akkor használhatjuk a Toplevel widget-et. Ez egy új ablakot csinál a képernyőn.
pl.:
Megjegyzés: nem kell használni a pack() vagy más fv-t a kiíráshoz, mert ez automatikusan megjelenik az ablakkezelő által.
Ez a példa jól bemutatja a menük megjelenítését, almenü létrehozását, illetve hogy hívunk meg egy függvényt, amikor az egyes menüpontra kattint a felhasználó.
pl.:
Legtöbbször használt függvények gyors meghívására.
Pl.:
Ebben a példában a gombok az eszköztáron balra, míg maga az eszköztár a tetőhöz van igazítva.
Ebben a példában az ikonok helyett szöveget írtunk, a képek megjelenítéséhez kell használni a PhotoImage konstruktort a kép betöltésére, és az image opciót ennek elhelyezésére.
A tkMessageBox modul nyújt interfészt az üzenőablak létrehozására.
A legegyszerűbb módja egy üzenőablak létrehozásának a következő függvények használata: showinfo, showwarning, showerror, askquestion, askokcancel, askyesno vagy askretrycancel. Mindnek ugyanaz a szintaxisa:
tkMessageBox.function(cím, üzenet [, options]), ahol a cím a felbukkanó ablak címe, az üzenet pedig az ablakban megjelenő üzenet.
Mi megadjuk az üzenetet és az ablak címét, és az ablak addig van fenn, amíg nem nyom a felhasználó ’ok’ –t.
Pl.:
Eldöntendő kérdés, választási lehetőséget kínál fel
pl.:
Opció |
Típus |
Leírás |
Default |
constant |
Melyik legyen a default gomb: ABORT, RETRY, IGNORE, OK, CANCEL, YES, NO |
Icon |
constant |
Melyik ikont tüntesse fel az üzenet mellett: ERROR,INFO, QUESTION, WARNING |
message |
String |
Üzenet szövege |
Parent |
widget |
Melyik ablak kapja meg a vezérlést az adott ablak bezárásakor |
Title |
String |
Üzenőablak címe |
Type |
constant |
Üzenőablak típusa; melyik gombok jelenjenek meg az ablakon: ABORTRETRYIGNORE, OK, OKCANCEL, RETRYCANCEL, YESNO vagy YESNOCANCEL |
Figyelem! A message és a title paraméterént adódik át, nem opcióként!!!
A tkSimpleDialog modul nyújt lehetőséget különböző egyszerű adatbevitel megvalósítására. Például az askstring függvénnyel bekérünk egy stringet és utána választhatunk az ’OK’ és a ’Cancel’ gombok közül.
Hasonlóan működik a numerikus érték bekérése is.
A tkFileDialog modult használhatjuk egy file bekérésére.
A tkcolorChooser modullal pedig egy RGB színértéket tudunk meghatározni.