猿问

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

使用 Python 3.7 - 在 Pycharm 中工作


我目前正在做一个项目,我不断地生成新的小部件并删除它们以显示不同的东西,我遇到了一个相当烦人的问题,我似乎无法弄清楚,更不用说找到相关信息了。当一排框架中的顶部小部件(框架)被制作 255 次时它会崩溃。我想这与它如何以字节为单位存储信息有关。


编辑*


我意识到我最初的解释比它需要的要复杂,所以这里是一个简化版本:


from tkinter import *


list = []

for x in range(1):

    e = Frame()

    list.append(e)

print(list) #Prints .!frame


list.clear()

print(list) #Prints [], the list is now empty


for 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 empty


list[0].destroy()

list[0].forget()

print(list) #.!frame2 is still there


list.clear()


print(list) #list is now empty again


for x in range(1):

    e = Frame()

    list.append(e)

print(list) #Prints .!frame3, and it still remembers.

如您所见,它不断添加到 .!frame 编号。


我正在寻找的是一种防止它到达 .!frame255 的方法


慕村225694
浏览 185回答 1
1回答

翻翻过去那场雪

当一排框架中的顶部小部件(框架)被制作 255 次时它会崩溃。我想这与它如何以字节为单位存储信息有关。不,这与此无关。我认为您关于程序在数字达到 255时崩溃的断言可能是错误的。很容易创建一个 tkinter 程序,即使这个数字达到数千,它也能继续工作。如果您查看 tkinter 源代码,您会发现它只是一个附加到字符串的普通整数。您似乎误解了list变量与存储在其中的小部件之间的关系。清除列表不会破坏列表中的小部件。您必须单独删除每一个,或者销毁它们的父级。在这种情况下,它们的父窗口是根窗口,因此这不是一个可行的解决方案。如果要销毁所有帧,请在清除列表之前使用一个小循环:for frame in list:    frame.destroy()tkinter 分配给小部件的数字无关紧要。数字是多少并不重要,它可能反映也可能不反映实际存在的小部件数量。这是一个不重要的内部细节。如果要查看实际存在多少个小部件,可以winfo_children在根窗口上调用。为此,您需要对根窗口的引用。最简单和最好的方法是在代码的开头显式创建根窗口:root = Tk()在脚本结束时,您可以打印出实际存在的所有窗口:print("all windows:", root.winfo_children())在您的示例代码中,它正好显示了两个小部件,这是预期的。您创建一个小部件,然后创建第二个小部件,然后删除第一个小部件,然后创建第三个小部件。
随时随地看视频慕课网APP

相关分类

Python
我要回答