如何在 Python Tkinter 中停止事件传播?

pythontkinterserver side programmingprogramming

Tkinter 事件在处理小部件的不同对象和属性以及应用程序的元素方面非常强大。可以通过将事件或回调函数与按钮绑定来处理诸如鼠标事件和键盘按钮事件之类的事件。

假设我们正在创建一个应用程序,该应用程序具有两个单击画布小部件中定义的对象的事件。这两个对象基本上是画布内定义的形状(一个矩形和一个椭圆形)。

我们可以执行按钮单击事件之类的操作来验证用户单击的是矩形还是椭圆形。要执行此操作,我们可以使用 tag_bind(shape, "Button", callback) 函数,该函数在特定形状上单击按钮时触发回调事件。

示例

以下示例演示了此应用程序的工作原理。这里,我们创建了两个函数,只要用户点击特定形状,它们就会打印。

# 导入所需的库
from tkinter import *

# 创建 tkinter 框架或窗口的实例
win = Tk()

# 设置窗口的大小
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

# 创建画布小部件
canvas = Canvas(win)

# 在画布内创建一个椭圆
oval = canvas.create_oval(500 / 2 - 10, 400 / 2 - 10, 500 / 2 + 10, 400 / 2 + 10, fill='red')

# 在画布内创建一个矩形
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()

输出

运行上述代码将显示一个具有两种形状(一个矩形和一个椭圆形)的窗口。单击每个形状将在主屏幕上打印消息,以验证发生了哪个事件。

单击圆形时,您将获得以下响应 -

You have clicked the oval

单击矩形时,您将获得以下响应,

You have clicked the rectangle

但是,单击画布时,您将不会获得任何响应,因为我们已经设置了"event.widget.tag_click = False"

示例

现在,让我们注释掉event.widget.tag_click在所有三个函数中都包含部分。代码如下所示 -

# 导入所需的库
from tkinter import *

# 创建 tkinter 框架或窗口的实例
win = Tk()

# 设置窗口的大小
win.geometry("700x350")

def oval_mouse_click(event):
    # event.widget.tag_click = True
    print("您已单击椭圆形")

def rec_mouse_click(event):
    # event.widget.tag_click=True
    print("您已单击矩形")

def canvas_click(event):
    # if event.widget.tag_click:
    # event.widget.tag_click = False
    # return
    print ("您已单击画布")

# 创建画布小部件
canvas = Canvas(win)

# 在画布内创建椭圆形
oval = canvas.create_oval(500 / 2 - 10, 400 / 2 - 10, 500 / 2 + 10, 400 / 2 + 10, fill='red')

# 在画布内创建矩形
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()

输出

现在,当您单击画布上的某个对象(假设是矩形对象)时,它将引发一个事件并调用 rec_mouse_click(event),但它并不会就此停止。它将进一步传播事件并调用 canvas_click(event)。因此,您将获得以下输出 -

您已单击矩形
您已单击画布

相关文章