2012-10-30 50 views
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,爲什麼不設置其他值呢?

回答

1

如果你繪製自己的形狀時沒有填充,從Tkinter的角度來看,你並不是徘徊在你的形狀,你正在盤旋背景。如果沒有填充,只有形狀的筆畫對鼠標事件(輸入,離開,CURRENT ...)是明智的。

您可以使用find_系列中的另一種方法解決此問題:find_closestfind_overlapping

請注意,由於鼠標事件採樣,您還可以進入現有形狀而不觸發輸入(在筆畫上跳躍),因此不會顯示背景,意味着您的圓圈不會移動,並且您將創建另一個圓圈但是你的半徑和鼠標不太可能)。

+0

謝謝。關於懸停在未填充的形狀上的觀察是有道理的。我認爲其他任何找到的方法都不會有效 - 例如只要畫布中至少有一個其他的grabbablePoint,find_closest就會始終返回一個值。我將使用我已經找到的默認填充解決方案,但我感謝您解釋它的工作原理。 –