Grafika v Pythonu – knihovna TKinter 3: Události klávesnice

U grafických aplikací je hlavním vstupním zařízením myš nebo dotykový displej, nicméně velice často chceme, aby naše aplikace uměla reagovat na povely z klávesnice. To samozřejmě podporuje i knihovna TKinter. Musíme jen připravit obslužnou rutinu (podprogram), která bude zachytávat události klávesnice a zpracovávat je podle naší potřeby.

Rutiny obsluhující události si převezmou událost jako parametr podprogramu – objekt typu Event. Událost se pak předá jako argument a my můžeme využít její atributy, v tomto případě char, keysym a keycode.

def move(event):
    print(event.char, event.keysym, event.keycode)

Stisk každé klávesy pak vygeneruje příslušné kódy, které můžeme při obsluze události využít.

U kurzorových a dalších kláves použijeme spíš atributy keysym nebo keycode, u běžných znaků nám stačí atribut char.

  Left 113
  Right 114
  Up 111
  Down 116
a a 38
w w 25

Následně musíme obsluhu události svázat se smyčkou událostí pomocí metody bind:

hlavni_okno.bind("<Key>", move)

Celý program, který bude po ploše přesouvat čtvereček pomocí kurzorových kláves a měnit jeho barvu pomocí písmen u, i a o, pak bude vypadat například následovně:

Program: Pohyb čtverečku pomocí kurzorových šipek

from tkinter import *
 
hlavni_okno = Tk()
 
popisek = Label(hlavni_okno, text="GRAFIKA V PYTHONU - Klávesnice")
popisek.pack()

# tvoříme plátno
sirka = 400
vyska = 300
platno = Canvas(hlavni_okno, width=sirka, height=vyska)
platno.pack()

# tvoříme obdélník, který se bude hýbat pomocí kurzorových šipek
x1 = sirka / 2
y1 = vyska / 2
barva = "red"
obd = platno.create_rectangle(x1, y1, x1 + 20, y1 + 20,fill=barva)
 
# na dané pozici nakreslíme obdélník, ale nejprve ho smažeme
def draw_rect():
    global obd        # využíváme globální proměnnou, ta si obdélník pamatuje
    platno.delete(obd)
    obd = platno.create_rectangle(x1, y1, x1 + 20, y1 + 20, fill=barva)
 

# podprogram, který na základě událostí mění parametry obdélníku
def move(event):
    global x1, y1, barva
    print(event.char, event.keysym, event.keycode)
    if event.keysym == "Left":
        x1 -= 10
    elif event.keysym == "Right":
        x1 += 10
    elif event.keysym == "Up":
        y1 -= 10
    elif event.keysym == "Down":
        y1 += 10
    elif event.char == "u":
        barva = "green"
    elif event.char == "i":
        barva = "blue"
    elif event.char == "o":
        barva = "red"
    draw_rect()
 
# svážeme události klávesnice s ovládacím podprogramem 
hlavni_okno.bind("<Key>", move)
 
hlavni_okno.mainloop()

Obsluha událostí klávesnice se odehrává v podprogramu move(). Podprogram podle hodnot atributů události event změní souřadnice našeho čtverečku, případně jeho barvu.

Následně vyvolá jeho překreslení podprogramem draw_rect(), který předcházející obdélník smaže a na nových souřadnicích a se zvolenou barvou nakreslí nový.

Opět, kdybychom zakomentovali příkaz platno.delete(obd) v podprogramu draw_rect(), tak by se místo přesunu obdélníku konala je ho duplikace a program by kreslil cestu obdélníku.