为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Tkinter 在 Python 中重置生成的小部件计数

使用 Tkinter 在 Python 中重置生成的小部件计数

慕村225694 2021-08-17 17:04:26
使用 Python 3.7 - 在 Pycharm 中工作我目前正在做一个项目,我不断地生成新的小部件并删除它们以显示不同的东西,我遇到了一个相当烦人的问题,我似乎无法弄清楚,更不用说找到相关信息了。当一排框架中的顶部小部件(框架)被制作 255 次时它会崩溃。我想这与它如何以字节为单位存储信息有关。编辑*我意识到我最初的解释比它需要的要复杂,所以这里是一个简化版本:from tkinter import *list = []for x in range(1):    e = Frame()    list.append(e)print(list) #Prints .!framelist.clear()print(list) #Prints [], the list is now emptyfor x in range(1):    e = Frame()    list.append(e)print(list) #Prints .!frame2, which is one step up from the previous one even the list started emptylist[0].destroy()list[0].forget()print(list) #.!frame2 is still therelist.clear()print(list) #list is now empty againfor x in range(1):    e = Frame()    list.append(e)print(list) #Prints .!frame3, and it still remembers.如您所见,它不断添加到 .!frame 编号。我正在寻找的是一种防止它到达 .!frame255 的方法
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

当一排框架中的顶部小部件(框架)被制作 255 次时它会崩溃。我想这与它如何以字节为单位存储信息有关。


不,这与此无关。我认为您关于程序在数字达到 255时崩溃的断言可能是错误的。很容易创建一个 tkinter 程序,即使这个数字达到数千,它也能继续工作。如果您查看 tkinter 源代码,您会发现它只是一个附加到字符串的普通整数。


您似乎误解了list变量与存储在其中的小部件之间的关系。清除列表不会破坏列表中的小部件。您必须单独删除每一个,或者销毁它们的父级。在这种情况下,它们的父窗口是根窗口,因此这不是一个可行的解决方案。


如果要销毁所有帧,请在清除列表之前使用一个小循环:


for frame in list:

    frame.destroy()

tkinter 分配给小部件的数字无关紧要。数字是多少并不重要,它可能反映也可能不反映实际存在的小部件数量。这是一个不重要的内部细节。


如果要查看实际存在多少个小部件,可以winfo_children在根窗口上调用。为此,您需要对根窗口的引用。最简单和最好的方法是在代码的开头显式创建根窗口:


root = Tk()

在脚本结束时,您可以打印出实际存在的所有窗口:


print("all windows:", root.winfo_children())

在您的示例代码中,它正好显示了两个小部件,这是预期的。您创建一个小部件,然后创建第二个小部件,然后删除第一个小部件,然后创建第三个小部件。


查看完整回答
反对 回复 2021-08-17
  • 1 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信