web-dev-qa-db-ja.com

イベントをCanvasアイテムにバインドする方法は?

キャンバスを使用してデータを表示していて、ユーザーがキャンバス上のさまざまなアイテムをクリックして、より多くの情報を取得したり、何らかの方法で操作したりできるようにしたい場合、これを行う最善の方法は何ですか?

オンラインで検索すると、イベントをタグにバインドする方法に関する情報を見つけることができますが、それは私が望むものよりも間接的であるようです。タグを使用してアイテムをグループ化するのではなく、ユーザーがキャンバス上の特定のアイテムをクリックしたときに特定の関数を呼び出します。

28
Ian

Canvasオブジェクトに含まれるオブジェクトを操作するには、次の形式のtag_bind()を使用する必要があります:tag_bind(item, event=None, callback, add=None)

Itemパラメータは、タグまたはIDのいずれかです。

これは概念を説明するための例です:

from tkinter import * 

def onObjectClick(event):                  
    print('Got object click', event.x, event.y)
    print(event.widget.find_closest(event.x, event.y))

root = Tk()
canv = Canvas(root, width=100, height=100)
obj1Id = canv.create_line(0, 30, 100, 30, width=5, tags="obj1Tag")
obj2Id = canv.create_text(50, 70, text='Click', tags='obj2Tag')

canv.tag_bind(obj1Id, '<ButtonPress-1>', onObjectClick)       
canv.tag_bind('obj2Tag', '<ButtonPress-1>', onObjectClick)   
print('obj1Id: ', obj1Id)
print('obj2Id: ', obj2Id)
canv.pack()
root.mainloop()
60
tdedecko