Podobně jako události z klávesnice, které jsme si ukázali v minulém dílu, zpracujeme i události myši. Opět svážeme obslužnou proceduru události myši s událostmi pomocí metody bind
, prostřednictvím atributů objektu event
si vyzvedneme souřadnice události. Obslužná procedura může vypadat např. takto:
def klik_mysi_L(event): x = event.x # získej pozici myši z události y = event.y # získej pozici myši z události print("Button-1 pressed at",x,",",y)
Se smyčkou událostí ji svážeme takto:
hlavni_okno.bind("<Button-1>", klik_mysi_L)
Myš má většinou tři tlačítka, <Button-1>
je tedy levé tlačítko, <Button-2>
je prostřední tlačítko a <Button-3>
je pravé tlačítko.
Při kliku myši se nakreslí modré kolečko
from tkinter import * from random import * # ======== 1. úvodní část - inicializace okna a ovládacích prvků # ======== statické prvky a globální proměnné hlavni_okno = Tk() popisek = Label(hlavni_okno, text="KOSTRA PROGRAMU S TKINTER") popisek.pack(side=TOP) tlacitko1 = Button(hlavni_okno, text="KONEC", fg="red", command=hlavni_okno.destroy) tlacitko1.pack(side=BOTTOM) platno_sirka = 350 platno_vyska = 350 platno = Canvas(hlavni_okno, width=platno_sirka, height=platno_vyska) platno.pack() # ======== 2. dynamické prvky # ======== 3. obsluha událostí def klik_mysi_L(event): x = event.x #získej pozici myši z události y = event.y #získej pozici myši z události print("Button-1 pressed at",x,",",y) ov2 = platno.create_oval(x-1, y-1,x+1, y+1, outline="blue") # ======== 4. navázání událostí a hlavní smyčka programu hlavni_okno.bind("<Button-1>", klik_mysi_L) hlavni_okno.mainloop()
Někdy nám nestačí pouhý stisk tlačítka myši, ale potřebujeme i další události: uvolnění tlačítka nebo pohyb myši při stisknutém tlačítku. I tyto události můžeme samozřejmě zachytávat a zpracovávat. Pohyb myši zachytíme pomocí selektoru <B1-Motion>
, <B2-Motion>
nebo <B3-Motion>
.
Při držení levého nebo pravého tlačítka se kreslí malá kolečka
from tkinter import * def kresli(event): x = event.x y = event.y platno.create_oval(x-1, y-1, x+1, y+1, outline="green" ) def kresli2(event): x = event.x y = event.y platno.create_oval(x-1, y-1, x+1, y+1, outline="red" ) #------------------ MAIN ---------------------- hlavni_okno = Tk() hlavni_okno.title( "Malování pomocí oválů" ) napoveda = Label( hlavni_okno, text = "Stiskni tlačítko a hýbej myší..." ) napoveda.pack( side = TOP ) platno_sirka = 350 platno_vyska = 350 platno = Canvas(hlavni_okno, width=platno_sirka, height=platno_vyska) platno.pack(expand = YES, fill = BOTH) platno.bind( "<B1-Motion>", kresli ) platno.bind( "<B3-Motion>", kresli2 ) tlacitko = Button(hlavni_okno, text="KONEC", fg="blue", command=hlavni_okno.destroy) tlacitko.pack(side=BOTTOM)
Tentokrát svazujeme dvě události myši <B1-Motion> a <B3-Motion> se dvěma ovladači kresli()
a kresli2()
. To je v pořádku, Python vždy zavolá správnou obslužnou proceduru. Co ale nejde, je připojit dva ovladače události na tu samou událost.