5

これらの一連の長方形をキャンバスに描画しました。それらはすべて Button-1 イベントにバインドされます。私がやりたいのは、イベントを呼び出すウィジェットの ID を持つ変数を設定することです。ここに私がやりたいことの疑似コードがあります

def clicked(e): #event handler. Binds to rectangle objects
    selected_button = e.widgets.get_id()

PS : イベント ハンドラーをこれらの四角形オブジェクトにのみバインドしますが、コード e.widget.destroy() をそのハンドラー内に配置すると、キャンバスも破棄されます。

4

1 に答える 1

7

エグゼクティブサマリー

キャンバス メソッドはタグまたはアイテム ID を区別なく受け入れるため、コンパクトなコールバックを使用できます。

def autodestroy(event):
    event.widget.delete("current")

詳細

コールバックは Tkinterイベントを一意のパラメーターとして受け取ります。このパラメーターは、刺激されたウィジェットやその他の情報 (マウス イベントの場合はマウス座標またはボタン) を取得できるオブジェクトです。

def clicked(event):
    canvas = event.widget

クリックされたキャンバスアイテムを取得するには、 CURRENT1タグを使用できます。

    rect = canvas.find_withtag("current")[0]

find_closestまたは、find_overlappingfind_enclosed...でピッキングを再現します( effbot.orgからコピー)

    canvas = event.widget
    x = canvas.canvasx(event.x)
    y = canvas.canvasy(event.y)
    rect = canvas.find_closest(x, y)[0]

find_ファミリが返すタプルは、状況によっては空になる可能性があり、空であることをテストしたり、例外をキャッチしたりする可能性があることに注意してください。

次に、キャンバスのアイテムcanvas.deleteを削除するには、メソッドを使用できます。

    canvas.delete(rect)

キャンバス メソッドはタグまたはアイテム ID を区別なく受け入れるため、よりコンパクトな記述を使用できます。

def autodestroy(event):
    event.widget.delete("current")

1 Tkinter.CURRENT"current"同等

于 2012-10-29T17:11:22.743 に答える