Aplikácia Tkinter trávi väčšinu času v slučke udalostí, ku ktorej pristupuje pomocou metódy mainloop. Udalosti pochádzajú z rôznych zdrojov vrátane stlačení klávesov a operácií myši používateľom, ako aj udalostí prekresľovania zo správcu okien (v mnohých prípadoch sprostredkovaných aj používateľom).
Tkinter poskytuje výkonný mechanizmus, ktorý umožňuje obsluhovať tieto udalosti. Pre každý widget môžete jeho udalosti viazať (bind) na funkcie a metódy jazyka Python
widget.bind(event, controller)
Keď sa na widgete vyskytne udalosť, zavolá sa ovládač s parametrom popisujúcim udalosť.
from tkinter import *
root= Tk()
def funkcia(udalost):
print("kliknutie na pozíciu:", udalost.x, udalost.y)
frame= Frame(root, width=100, height=100)
frame.bind("<Button-1>", funkcia)
frame.pack()
root.mainloop()
V tomto príklade použijeme metódu bind nástroja ‚frame‘ na priradenie funkcie ‚funkcia‘ k udalosti s názvom . Spustite tento program a kliknite v zobrazenom okne. Pri každom kliknutí sa do okna konzoly vypíše správa typu „kliknuté na pozícii: 44 63“.
Udalosti klávesnice sa odosielajú miniaplikácii, ktorá má momentálne fokus. Ak teda chcete, aby klávesnica fungovala v celej aplikácii, priraďte príslušnú udalosť k hlavnému oknu alebo najvyššiemu rámu. Ak chcete mať pre každý widget rôzne väzby klávesov, musíte zabezpečiť vhodné prepínanie fokusu medzi widgetmi (napr. pomocou udalostí a ). Na nastavenie fokusu na konkrétny widget môžete použiť metódu focus_set:
from tkinter import *
root = Tk()
def klavesa(udalost):
print("stlačená klávesa: ", repr(udalost.char))
frame = Frame(root, width=100, height=100)
frame.bind("<Key>", klavesa)
frame.pack()
frame.focus_set()
root.mainloop()
Popisovače udalostí sa zadávajú ako reťazce pomocou špeciálnej syntaxe:
<modifikácia-pole-detail>
Najdôležitejšou časťou deskriptora udalosti je pole . Určuje typ udalosti, ktorú chceme zviazať, a môže ísť o používateľské akcie, napríklad tlačidlo alebo kláves, alebo o udalosti správcu okien, napríklad Enter, Configure a iné. Polia modifikácia a detail sa používajú na rozšírené informácie – v mnohých prípadoch ich možno vynechať.
Namiesto toho, aby sme na niekoľkých stranách rozoberali všetky syntaktické skratky, pozrime sa na najčastejšie používané formáty udalostí:
Formáty udalostí
<Button-1>
Tlačidlo na myši je stlačené nad widgetom. Tlačidlo 1 je úplne vľavo, tlačidlo 2 je uprostred a tlačidlo 3 je vpravo od myši. Keď stlačíte tlačidlo myši na widgete, aplikácia Tkinter automaticky zachytí ukazovateľ myši a udalosť myši sa odošle do aktuálneho widgetu. Aktuálna poloha ukazovateľa myši (vzhľadom k widgetu) je potom prístupná v atribútoch x a y udalosti odoslanej do volanej funkcie.
Namiesto Button môžete použiť ButtonPress alebo ho dokonca úplne vynechať: <Button-1>, <ButtonPress-1> a <1> sú synonymá. Z dôvodu čitateľnosti uprednostňujem syntax <Button-1>.
<B1-Motion>
Myš sa pohybuje so stlačeným tlačidlom 1 (použite B pre stredné tlačidlo a B3 pre pravé tlačidlo). Aktuálna poloha myši je uvedená v atribútoch x a y v udalosti odoslanej funkcii.
<ButtonRelease-1>
Tlačidlo 1 bolo uvoľnené. Aktuálna poloha myši je uvedená v atribútoch x a y v udalosti odoslanej volanefunkcii.
<Double-Button-1>
Na tlačidlo 1 ste klikli dvakrát. Ako predpony môžete použiť Double alebo Triple. Ak widget viažete na jedno kliknutie ( ) aj na dvojité kliknutie, budú vyvolané obe udalosti.
<Enter>
Ukazovateľ myši vstúpil do widgetu (táto udalosť neznamená, že používateľ stlačil Enter !).
<Leave>
Ukazovateľ myši opustil widget.
<FocusIn>
Tento widget (alebo jeho potomok) získal fokus klávesnice.
<FocusOut>
Zameranie bolo presunuté z tohto widgetu na iný.
Klávesy klávesnice – napr. <Return>
Všetky klávesy na klávesnici sa dajú použiť na viazanie. Pre bežnú 102-klávesovú klávesnicu existujú špeciálne klávesy Cancel, BackSpace, Tab, Return (kláves Enter), Shift_L (ľavý Shift), Control_L (ľavý Control), Alt_L (ľavý Alt), Pause, Caps_Lock, Escape, Prior (Page Up), Next (Page Down), End, Home, Left, Up, Right, Down, Print, Insert, Delete, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, Num_Lock a Scroll_Lock.
<Key>
Používateľ stlačil ľubovoľné tlačidlo. Kľúč je uvedený v atribúte char udalosti, ktorá sa odovzdáva volanej funkcii (v prípade špeciálnych kľúčov je to prázdny reťazec).
a
Používateľ napísal písmeno „a“ . Takto možno použiť väčšinu tlačiteľných znakov. Výnimkou sú klávesy medzera ( ) a „je menší“ ( ). 1 označuje väzbu na kláves „1“, zatiaľ čo <1> je väzba na myš. napríklad <Key-g>
<Shift-Up>
Používateľ stlačí kláves so šípkou nahor a zároveň podrží stlačený kláves Shift. Ako predponu môžete použiť klávesy Alt, Shift a Control.
<Configure>
Veľkosť widgetu bola zmenená (na niektorých platformách umiestnenie). Nová veľkosť je uvedená v atribútoch šírka a výška udalosti odovzdanej volanej funkcii.
<Control-Shift-KeyPress-H>
Používateľ stlačil CTRL+SHIFT+H. Rozlišujú sa veľké a malé písmená, takže napríklad nie je to isté ako . V prvom prípade musíte navyše podržať kláves Shift, aby ste získali veľké písmeno „H“.
<MouseWheel>
Používateľ roloval pomocou kolieska myši. Smer posúvania je uvedený v atribúte delta udalosti odovzdanej volanej funkcii.
from tkinter import *
root = Tk()
def klavesa(udalost):
print("Teraz ste stlačili klávesu G")
def lave_tlacitko_mys(udalost):
print("Stlačené tlačitko myši")
frame = Frame(root, width=100, height=100)
frame.bind("<Key-g>", klavesa)
frame.bind("<Button-1>", lave_tlacitko_mys)
frame.pack()
frame.focus_set()
root.mainloop()