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

执行摘要

由于 canvas 方法接受标签或项目 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_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]

请注意,find_家庭返回元组,在某些情况下可能为空,您可能会测试为空或捕获异常。

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

    canvas.delete(rect)

由于 canvas 方法接受标签或项目 ID 的方式无关紧要,因此您可以使用更紧凑的编写方式:

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

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

于 2012-10-29T17:11:22.743 回答