python 检查小部件是否存在(Tkinter)

fjnneemd  于 2023-04-28  发布在  Python
关注(0)|答案(2)|浏览(224)

我想在删除小部件(如画布上绘制的矩形)之前检查它是否存在。
我的问题是我有两个删除矩形的方法。一个是使用bind绑定到button-1(当矩形被点击时删除它),另一个方法是在矩形在一定时间内没有被点击时删除它(使用Widget.after检查)。我想在第二个方法中检查矩形是否存在,因为我想计算用户没有点击的矩形,我能想到的唯一方法是检查它是否已经被删除。有办法做到这一点吗?当然,我可以在button-1事件处理程序中设置一个变量,然后从另一个方法中检查它。但是只是想知道Tkinter是否提供了诸如“item exist”的方法。
编辑:好吧,我刚刚发现了一个窍门。如果我在已删除的小部件上使用itemconfig,我会得到空集。我使用该值来查看小部件是否已被删除。我不确定这是不是一种优雅的方式。

j7dteeu8

j7dteeu81#

在我看来,您可以使用Canvas.find_all来获取画布上所有项的元组。然后你可以看到你的特定项是否是in那个元组。例如:

if item in my_canvas.find_all():
   my_canvas.delete(item)
else:
   print("Item not on canvas")
hjzp0vay

hjzp0vay2#

您也可以使用forget取消对小部件的Map,而不是销毁它,这样小部件就消失了,但变量名仍然有效。widget.winfo_ismapped()会告诉你它是否被Map。

>>> root = tk.Tk()
>>> widget = tk.Label(root, text='squeamish ossifrage')
>>> widget.winfo_ismapped()
0
>>> widget.pack()
>>> widget.winfo_ismapped()
1
>>> widget.forget()
>>> widget.winfo_ismapped()
0

在一个未Map的小部件上运行widget.forget()没有问题,因此您甚至不需要为将来的语句检查它的状态;只需运行forget或运行pack或根据需要覆盖变量。

相关问题