python - 大量使用后,Tkinter程序崩溃

标签 python user-interface crash tkinter visual-glitch

我是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/

相关文章:

python - 如何设置 web2py fixtures

java - 来自另一个类的 RadioButton setText

android - 为什么从MainActivity到AnotherActivity的 Intent 不起作用?

c++ - 观看变量时 Visual Studio 2005 崩溃

java - Java TrayIcon.setToolTip()使具有128个字符的String上的JVM崩溃

python - 通过bash脚本和pip在虚拟环境中安装python包

python - 如何加速 JavaScript 网页抓取的过程?

python - 如何从字符串中间获取 2 个字符?

javascript - 如何调试 JQuery 选项卡的浏览器兼容性问题?

c++ - wxPropertyGrid 自定义 slider 属性问题