我正在开发一个需要重新定位画布项的应用程序。我开发了以下的grabbablePoint类,但是新点不是CURRENT,除非我将鼠标移开然后再移回点。
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,为什么不设置它呢?
答案 0 :(得分:1)
如果你没有填充你的形状,从Tkinter的角度来看,你不是悬停你的形状,你正在盘旋背景。如果没有填充,只有形状的笔划对鼠标事件是敏感的(输入,离开,CURRENT ......)。
您可以使用find_
系列中的其他方法解决此问题:find_closest
,find_overlapping
。
请注意,由于鼠标事件采样,您还可以进入现有形状而不会触发输入(跳过笔画),因此不会显示暗示您的圆圈不会移动的背景,并且您将创建另一个圆圈(但是您的半径和鼠标不太可能。)