testovac.sk

Udalosti myši a klávesnice

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.

myš a procedúra

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)

klávesnica a procedúra

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'

Klik na objekt v canvas

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)