我是Tkinter的新手,在此之前仅开发了一个GUI。我决定使用标签在10 x 10的网格中创建一个随机地形生成器,以表示一个块。我已经完成它,并通过制作大量标签修复了内存泄漏。我还实现了随机按钮和滚动。但是,在对网格进行大约100次更新(我最后检查了大约98次)之后,它将出现错误,并在窗口外部出现灰色框,并且世界的顶部将显示为灰色,然后程序将停止响应。没有错误消息,所以我不知道如何解决此问题。该代码位于pastebin上的:http://pastebin.com/SASFuQCZ上,尽管它很长。任何帮助解决此问题将不胜感激。谢谢。
最佳答案
也许其他人可以弄清楚,但是对我来说,您的代码简直太难理解了。但是,即使我不能解决问题,我也可以提供一些建议,帮助您减少大约一千行代码,这可能会使问题更容易发现。
您是否知道可以循环创建窗口小部件?您可以使用非常简单的技术轻松删除几百行代码。另外,您是否知道可以更改现有标签的颜色而不破坏它并重新创建它?
最后,您不需要所有这些StringVar实例,因为您只在其中存储了一种颜色。普通变量即可。只有当您试图将两个或多个小部件的标签或值连接在一起时,StringVars才真正有用。如果要将单元格颜色存储在变量中,请将它们存储在用于标签的相同数据结构中,然后重绘函数只需执行一个循环即可将每种颜色应用于每个单元格。
例如,要将所有初始颜色设置为“宝蓝色”,您可以执行以下操作。我使用字典,但是您可以很容易地使用列表列表:
color = {}
for row in range(10):
for column in range(10):
color[(row, column)] = "royal blue"
接下来,您可以使用相同的简单循环创建10x10标签的网格。这可以用仅6行代码替换用于创建原始标签的200行代码(加上另外100空行)。
# to create the labels and store them in a dictionary:
cell = {}
for row in range(10):
for column in range(10):
l = Label(app, text=" ", background=color[(row, column)])
l.grid(row=row, column=column)
cell[(row,column)] = l
您可以使用configure更新每个标签。因此,例如,要将标签0,0更改为红色,您可以这样做:
cell[(0,0)].configure(background="red")
您可以使用
cget
方法检索标签的背景色。例如,这将打印“红色”:print cell[(0,0)].cget("background")
使用所有这些技术可能会将您的代码减少到几百行,这将使您更容易发现任何错误。
关于python - 大量使用后,Tkinter程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22742411/