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.