我有一个 Tkinter 画布,并将鼠标按钮按下事件绑定到它。
我想知道是否可以弄清楚用户在绑定到画布时单击的特定形状:
def callback(event):
pass
canvas = Canvas(root, width=100, height=100)
canvas.create_rectangle(10,50,40,90, tags="tile")
canvas.bind("<Button-1>", callback)
我知道我可以将它绑定到矩形,问题是可能有另一个形状覆盖矩形,然后单击事件不再起作用。
我正在考虑使用
find_overlapping
方法:
def callback(event):
canvas.find_overlapping(event.x, event.y,event.x, event.y)
但想知道是否有更简单的方法?
您可以使用特殊项目标签
current
来引用光标下的对象。根据官方文档:
标签current由Tk自动管理;它适用于 current item,它是最上面的项目,其绘制区域覆盖了鼠标光标的位置(不同的项目类型以不同的方式对此进行解释;有关详细信息,请参阅各个项目类型文档)。如果鼠标不在画布小部件中或不在某个项目上,则没有项目具有 current 标签。
这是一个简单的例子。它绘制一堆彩色矩形,然后在单击它们时将颜色设置为白色。
import tkinter as tk
import random
def click_handler(event):
event.widget.itemconfigure("current", fill="white")
root = tk.Tk()
canvas = tk.Canvas(root, bg="bisque", width=400, height=400)
canvas.pack(fill="both", expand=True)
canvas.bind("<1>", click_handler)
for i in range(100):
x = random.randint(0, 350)
y = random.randint(0, 350)
color = random.choice(("red", "orange", "green", "blue"))
width = random.randint(25, 50)
height = random.randint(25, 50)
canvas.create_rectangle(x, y, x+width, y+height, fill=color)
root.mainloop()