如何获取调用事件的小部件的 id (Tkinter)

And*_*rew 4 python tkinter

我在画布上绘制了这些矩形集。它们都绑定到 Button-1 事件。我喜欢做的是使用调用事件的小部件的 id 设置一个变量。这是我喜欢做的伪代码

def clicked(e): #event handler. Binds to rectangle objects
    selected_button = e.widgets.get_id()
Run Code Online (Sandbox Code Playgroud)

PS:虽然我只将事件处理程序绑定到那些矩形对象,但当我在该处理程序中放置代码 e.widget.destroy() 时,画布也会被破坏。

Fab*_*dre 6

执行摘要

由于画布方法无差别地接受标签或项目 id,因此您可以使用紧凑回调

def autodestroy(event):
    event.widget.delete("current")
Run Code Online (Sandbox Code Playgroud)

细节

您的回调接收一个 Tkinter事件作为唯一参数。此参数是一个对象,您可以从中检索受刺激的小部件以及其他信息(鼠标坐标或鼠标事件中的按钮)。

def clicked(event):
    canvas = event.widget
Run Code Online (Sandbox Code Playgroud)

要获得点击的画布项目,您可以使用CURRENT1标签

    rect = canvas.find_withtag("current")[0]
Run Code Online (Sandbox Code Playgroud)

或使用find_closest, find_overlapping, find_enclosed...重现采摘(复制自effbot.org

    canvas = event.widget
    x = canvas.canvasx(event.x)
    y = canvas.canvasy(event.y)
    rect = canvas.find_closest(x, y)[0]
Run Code Online (Sandbox Code Playgroud)

请注意,find_family 返回元组,在某些情况下可能是空的,您可能会测试空性或捕获异常。

然后要删除画布的一个项目,您可以使用canvas.delete方法。

    canvas.delete(rect)
Run Code Online (Sandbox Code Playgroud)

由于 canvas 方法无差别地接受标签或项目 id,因此您可以使用更紧凑的书写方式:

def autodestroy(event):
    event.widget.delete("current")
Run Code Online (Sandbox Code Playgroud)

1 Tkinter.CURRENT并且"current"是等价的