tkinter canvas-从事件中提取对象ID?

时间:2019-02-17 09:08:30

标签: python-3.x tkinter tk

是否可以从事件中提取画布对象的ID?

例如,我想将一个项目添加到画布上并绑定到它-但是,如果我在画布上有多个项目,则需要对其进行区分。

def add_canvas_item(self,x,y):
    canvas_item_id = self.canvas.create_oval(x-50,y-50,x+50,y+50, fill='green')
    self.canvas.tag_bind(canvas_item_id ,"<ButtonPress-1>",self.stateClicked)

def itemClicked(self,event):
    print("Item XYZ Clicked!") <- Where XYZ is the ID of the item

我对此有一些非常“棘手的”方法(保持鼠标的轨迹,并向画布询问到该点最近的项目),但这似乎不是“最佳”的方法。

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用find_withtag()函数来返回被单击的项目,如下例所示:

from tkinter import *

root = Tk()
canvas = Canvas(root)
canvas.pack()

def itemClicked(event):
    canvas_item_id = event.widget.find_withtag('current')[0]
    print('Item', canvas_item_id, 'Clicked!')

def add_canvas_item(x,y):
    canvas_item_id = canvas.create_oval(x-50,y-50,x+50,y+50, fill='green')
    canvas.tag_bind(canvas_item_id ,'<ButtonPress-1>', itemClicked)

add_canvas_item(100,100)    # Test item 1
add_canvas_item(250,150)    # Test item 2

root.mainloop()

Tracking Mouse Actions for Many Canvas Objects上的简要说明