2
我正在處理需要重新定位帆布項目的應用程序。我開發了以下的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糾正這種不良行爲......
h = canvas.create_oval(x-r, y-r, x+r, y+r, fill='#FF0000')
現在,它完美的作品。任何人都可以向我解釋這裏發生了什麼?爲什麼添加一個屬性觸發CURRENT,爲什麼不設置其他值呢?
謝謝。關於懸停在未填充的形狀上的觀察是有道理的。我認爲其他任何找到的方法都不會有效 - 例如只要畫布中至少有一個其他的grabbablePoint,find_closest就會始終返回一個值。我將使用我已經找到的默認填充解決方案,但我感謝您解釋它的工作原理。 –