是否可以在 tkinter 中找到鼠标按钮按下事件中单击的画布形状?

问题描述 投票:0回答:1

我有一个 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)

但想知道是否有更简单的方法?

python tkinter tkinter-canvas
1个回答
1
投票

您可以使用特殊项目标签

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()

screenshot

© www.soinside.com 2019 - 2024. All rights reserved.