キャンバスアイテムの再配置が必要なアプリケーションに取り組んでいます。次の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がトリガーされるのはなぜですか?それ以外の場合は設定されないのはなぜですか?