Skip to main content
 首页 » 编程设计

python之新的 Canvas 项目不是当前的

2025年05月04日9freeliver54

我正在开发一个需要重新定位 Canvas 项目的应用程序。我开发了以下 grabbablePoint 类,但新点不是当前点,除非我将鼠标移开然后再移回该点。

try: 
    import tkinter as tk 
except ImportError: 
    import Tkinter as tk 
 
class grabbablePoint: 
 
    def __init__(self, canvas, x, y, r): 
        if not(canvas.find_withtag(tk.CURRENT)): 
            h = canvas.create_oval(x-r, y-r, x+r, y+r) 
            canvas.tag_bind(h, '<Enter>', lambda e,hh=h: canvas.itemconfig(hh,fill='#FF0000')) 
            canvas.tag_bind(h, '<Leave>', lambda e,hh=h: canvas.itemconfig(hh,fill='')) 
            canvas.tag_bind(h, '<B1-Motion>', lambda e,hh=h: canvas.coords(hh,e.x-r,e.y-r,e.x+r,e.y+r)) 
 
if __name__ == '__main__': 
    canv = tk.Canvas(width=400, height=300, bg='#CCCCFF') 
    canv.bind('<Button-1>',lambda e: grabbablePoint(canv,e.x,e.y,3)) 
    canv.pack() 
    tk.mainloop() 

因此,如果我在离开并返回之前单击一个点,它会在第一个点的正上方产生另一个点。奇怪的是,我可以通过向 create_oval 添加 fill 属性来纠正这种不良行为 ...

        h = canvas.create_oval(x-r, y-r, x+r, y+r, fill='#FF0000') 

现在它完美运行了。谁能向我解释这里发生了什么?为什么添加属性会触发 CURRENT,为什么不以其他方式设置?

请您参考如下方法:

如果您绘制没有填充的形状,从 Tkinter 的角度来看,您不是悬停您的形状,而是悬停在背景上。没有填充,只有形状的笔画对鼠标事件敏感(进入、离开、当前……)。

您可以使用 find_ 系列中的另一种方法来解决此问题:find_closest、find_overlapping。

请注意,由于鼠标事件采样,您还可以在不触发输入的情况下进入现有形状(跳到笔画上方),因此不会显示暗示您的圆圈不会移动的背景,并且您将创建另一个圆圈(但是你的半径和鼠标不太可能)。