如何解决抑制其他画布项目对事件做出反应
画布中的空白区域也在用回调函数“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,fill='red')
canvas.tag_bind(rectangle_id,'<Button-3>',lambda event: print('rectangle right click'))
window.mainloop()
解决方法
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,fill='red')
canvas.tag_bind(rectangle_id,'<Button-3>',element_right_click)
window.mainloop()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。