Ricerca nel sito web

Come interrompere la propagazione degli eventi in Python Tkinter?


Gli eventi Tkinter sono molto potenti nella gestione dei diversi oggetti e attributi dei widget, nonché degli elementi di un'applicazione. Esistono eventi come eventi del mouse ed eventi dei pulsanti della tastiera che possono essere gestiti associando l'evento o la funzione di callback al pulsante.

Supponiamo di creare un'applicazione che abbia due eventi di clic sugli oggetti definiti in un widget canvas. I due oggetti sono fondamentalmente le forme (un rettangolo e un ovale) definite all'interno della tela.

Possiamo eseguire azioni come l'evento Button Click per verificare se l'utente ha cliccato sul rettangolo o sull'ovale. Per eseguire questa azione, possiamo utilizzare la funzione tag_bind(shape, "Button", callback) che attiva l'evento callback ogni volta che si fa clic sul pulsante su una forma particolare.

Esempio

L'esempio seguente dimostra il funzionamento di questa applicazione. Qui abbiamo creato due funzioni che verranno stampate ogni volta che l'utente fa clic su una forma particolare.

# Import the required libraries
from tkinter import *

# Create an instance of tkinter frame or window
win = Tk()

# Set the size of the window
win.geometry("700x350")

def oval_mouse_click(event):
   event.widget.tag_click = True
   print("You have clicked the oval")

def rec_mouse_click(event):
   event.widget.tag_click=True
   print("You have clicked the rectangle")

def canvas_click(event):
   if event.widget.tag_click:
      event.widget.tag_click = False
      return

# Create a canvas widget
canvas = Canvas(win)

# Create an oval inside the canvas
oval = canvas.create_oval(500 / 2 - 10, 400 / 2 - 10, 500 / 2 + 10, 400 / 2 + 10, fill='red')

# Create a rectangle inside the canvas
rectangle = canvas.create_rectangle(50, 0, 100, 50, fill='blue')

canvas.tag_bind(oval, "<Button-1>", oval_mouse_click)
canvas.tag_bind(rectangle, "<Button-1>", rec_mouse_click)
canvas.bind("<Button-1>", canvas_click)
canvas.pack()

win.mainloop()

Produzione

Eseguendo il codice sopra verrà visualizzata una finestra con due forme (un rettangolo e un ovale). Cliccando su ciascuna delle forme verrà stampato il messaggio sulla schermata principale verificando quale evento si è verificato.

Facendo clic sul cerchio, otterrai la seguente risposta −

You have clicked the oval

Facendo clic sul rettangolo, otterrai la seguente risposta,

You have clicked the rectangle

Tuttavia, facendo clic sull'area di disegno, non riceverai alcuna risposta perché abbiamo impostato "event.widget.tag_click=False".

Esempio

Ora commentiamo la parte event.widget.tag_click in tutte e tre le funzioni. Ecco come apparirebbe il codice −

# Import the required libraries
from tkinter import *

# Create an instance of tkinter frame or window
win = Tk()

# Set the size of the window
win.geometry("700x350")

def oval_mouse_click(event):
   # event.widget.tag_click = True
   print("You have clicked the oval")

def rec_mouse_click(event):
   # event.widget.tag_click=True
   print("You have clicked the rectangle")

def canvas_click(event):
   # if event.widget.tag_click:
   #    event.widget.tag_click = False
   #    return
   print ("You have clicked the Canvas")

# Create a canvas widget
canvas = Canvas(win)

# Create an oval inside the canvas
oval = canvas.create_oval(500 / 2 - 10, 400 / 2 - 10, 500 / 2 + 10, 400 / 2 + 10, fill='red')

# Create a rectangle inside the canvas
rectangle = canvas.create_rectangle(50, 0, 100, 50, fill='blue')

canvas.tag_bind(oval, "<Button-1>", oval_mouse_click)
canvas.tag_bind(rectangle, "<Button-1>", rec_mouse_click)
canvas.bind("<Button-1>", canvas_click)
canvas.pack()

win.mainloop()

Produzione

Ora, quando fai clic su un oggetto (diciamo l'oggetto rettangolo) sull'area di disegno, verrà generato un evento e chiamerà rec_mouse_click(event), ma non si ferma qui. Propagherà ulteriormente l'evento e chiamerà canvas_click(event). Quindi, otterrai il seguente output −

You have clicked the rectangle
You have clicked the Canvas

Articoli correlati: