Grafika v Pythonu – knihovna TKinter 4: Události myši

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.