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にfill属性を追加することで、この望ましくない動作を修正できます...

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

今では完全に機能します。ここで何が起こっているのか誰かが私に説明できますか?属性を追加するとCURRENTがトリガーされるのはなぜですか?それ以外の場合は設定されないのはなぜですか?

4

1 に答える 1

1

塗りつぶしなしでシェイプを描画すると、Tkinter の観点からは、シェイプをホバリングしているのではなく、背景をホバリングしていることになります。塗りつぶしがなければ、シェイプのストロークのみがマウス イベント (入力、離脱、現在...) に反応します。

find_ファミリの別の方法を使用して、これを回避できます: find_closestfind_overlapping.

マウス イベントのサンプリングにより、Enter をトリガーせずに (ストロークの上にジャンプして) 既存の形状に入ることができることに注意してください。したがって、円が動かないことを意味する背景が表示されず、別の円が作成されます (ただし、 radius とマウス)。

于 2012-10-30T18:44:26.480 に答える