我在画布上绘制了这些矩形。它们都绑定到Button-1事件。我喜欢做的是设置一个变量,其id为调用该事件的小部件。这是我喜欢做的伪代码
def clicked(e): #event handler. Binds to rectangle objects
selected_button = e.widgets.get_id()
P.S:虽然我只将事件处理程序绑定到那些矩形对象,但是当我将代码e.widget.destroy()放在该处理程序中时,画布也会被销毁。
答案 0 :(得分:4)
由于canvas方法接受无关紧要的标签或项目id,因此您可以使用紧凑回调
def autodestroy(event):
event.widget.delete("current")
您的回调会收到Tkinter 事件作为唯一参数。此参数是一个对象,您可以从中检索受刺激的小部件,以及其他信息(鼠标事件时的鼠标坐标或按钮)。
def clicked(event):
canvas = event.widget
要获取点击的画布项,您可以使用CURRENT
1 标记
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"
等效