Grafická plocha canvas z knižnice tkinter umožňuje nastaviť, aká (naša vlastná) procedúra sa má vykonať, ak sa klikne na nejaký konkrétny objekt (obdĺžnik, ovál, obrázok) v canvas alebo ak sa stlačí nejaká klávesa. Takto sa dajú vytvárať rôzne interaktívne programy a aj hry.
Pomocou funkcie canvas.bind() môžeme prepojiť nejakú udalosť (kliknute myškou, ťahanie myši) s nejakou procedúrou. Táto procedúra sa potom vykoná vždy, keď nastane daná udalosť.
import tkinter
def klik(event):
print('klik')
canvas = tkinter.Canvas()
canvas.pack()
canvas.bind('<ButtonPress>', klik)
Všimnite si, že fukcia canvas.bind() berie dva parametre (do jej zátvoriek píšeme dve hodnoty). Prvý parameter určuje udalosť, na ktorú sa má reagovať (stlačenie konkrétneho tlačidla myši, ťahanie myši, ...) a druhý parameter hovorí, ktorý podprogram sa má vykonať. Pri rôznych udalostiach je teda možné vykonať rôzne podprogramy. Každá udalosť má svoj špecifický názov, kliknutie myši je napríklad <ButtonPress>.
Všimnite si tiež, že naša procedúra berie jeden parameter, nazvaný event. Pri prepojovaní udalosti a procedúry pomocou funkcie canvas.bind() je potrebné, aby procedúra mala jeden takýto parameter definovaný (nazvať si ho môžeme ako chceme). Pomocou tohoto parametra vieme napríklad zistiť, kam presne sa v canvas kliklo:
import tkinter
def klik(event):
print('klikli ste na súradnice X = ', event.x, "Y =", event.y)
canvas = tkinter.Canvas()
canvas.pack()
canvas.bind('<ButtonPress>', klik)
Pri udalostiach klávesnice používame funkciu canvas.bind_all().
V hre by to mohlo vyzerať takto:
import tkinter
def pohybVpred(event):
print("idem dopredu")
def pohybVlavo(event):
print("idem dolava")
def pohybVpravo(event):
print("idem vpravo")
def pohybVzad(event):
print("cuvam")
def pohybSkok(event):
print("skacem")
canvas = tkinter.Canvas()
canvas.pack()
canvas.bind_all('w', pohybVpred)
canvas.bind_all('a', pohybVlavo)
canvas.bind_all('d', pohybVpravo)
canvas.bind_all('s', pohybVzad)
canvas.bind_all('<space>', pohybSkok)
iné udalosti:
<Left>
<Right>
<Up>
<Down>
<Next>
<Escape>
<Return>
<F1>
'w'
'a'
's'
'd'
Takto sa dá zabezpečiť, že sa niečo stane, keď sa na niečo (na objekt ako obdĺžnik, kruh...) klikne...
# import a vytvorenie canvas-u
import tkinter
canvas = tkinter.Canvas(width=700, height=350, bg="white")
canvas.pack()
# podprogram, ktory sa spusti, ked sa klikne na obdlznik
def klikNaObdlznik(event):
print("bolo kliknute na obdlznik")
# vytvorim obdlznik
obdlznik = canvas.create_rectangle(90, 30, 150, 90, fill='green')
# prepojim obdlznik a podprogram klikNaObdlznik
canvas.tag_bind(obdlznik, '<ButtonPress-1>', klikNaObdlznik)