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.
