抑制其他画布项目对事件做出反应

时间:2021-07-19 06:49:36

标签: python tkinter tkinter-canvas

我在画布上有一个矩形,用于监听事件,带有回调函数“A”。

画布中的空白区域也在用回调函数“B”监听事件。

当我在矩形上右击时,“A”和“B”都会被执行。我明白为什么会发生这种情况(矩形在画布上)。

我想要创建的行为是仅当我右键单击矩形时才执行“A”。 如何阻止空白画布区域对事件做出反应?

请参阅下面的代码作为我当前行为的示例。

import tkinter as tk

window = tk.Tk()
window.geometry('500x500')
window.grid_rowconfigure(0, weight=1)
window.grid_columnconfigure(0, weight=1)

canvas = tk.Canvas(master=window)
canvas.grid(row=0, column=0, sticky='nsew')
canvas.bind('<Button-3>', lambda event: print('canvas right click'))

rectangle_id = canvas.create_rectangle(200, 200, 300, 300, fill='red')
canvas.tag_bind(rectangle_id, '<Button-3>', lambda event: print('rectangle right click'))

window.mainloop()

1 个答案:

答案 0 :(得分:0)

tkinter 中没有内置任何东西可以做到这一点。事实上,Canvas documentation 特别指出:

<块引用>

如果使用 bind 命令为画布窗口创建了绑定,那么除了使用 bind 小部件命令为画布项目创建的绑定之外,还会调用它们。项目的绑定将在整个窗口的任何绑定之前被调用。

一种解决方法是让你的标签绑定设置某种标志,告诉画布绑定不要做任何工作。

示例:

import tkinter as tk

do_right_click = True

def canvas_right_click(event):
    global do_right_click
    if do_right_click:
        print("canvas right click")
    do_right_click = True

def element_right_click(event):
    global do_right_click
    do_right_click = False  # prevent canvas from processing this event
    print("rectangle right click")

window = tk.Tk()
window.geometry('500x500')
window.grid_rowconfigure(0, weight=1)
window.grid_columnconfigure(0, weight=1)

canvas = tk.Canvas(master=window)
canvas.grid(row=0, column=0, sticky='nsew')
canvas.bind('<Button-3>', canvas_right_click)

rectangle_id = canvas.create_rectangle(200, 200, 300, 300, fill='red')
canvas.tag_bind(rectangle_id, '<Button-3>', element_right_click)

window.mainloop()
相关问题