我是Tkinter的新手,在此之前只开发过一个GUI。我决定创建一个随机地形生成器,使用标签来表示一个块,在一个10 x 10的网格中。我已经完成了它,并修复了一个内存泄漏与制作大量的标签。我还实现了一个随机按钮和滚动。然而,在大约100次(上次我检查了大约98次)网格更新之后,它会出现一个灰色框架,出现在窗口外面,世界的顶部将出现灰色,然后程序将停止响应。没有错误信息,所以我不知道如何解决这个问题。代码在pastebin上:http://pastebin.com/SASFuQCZ,虽然它很长。任何帮助修复这将是非常感激。谢谢。
也许其他人可以弄清楚,但对我来说,您的代码太难理解了。然而,即使我不能解决这个问题,我也可以提供一些建议,可能会帮助您减少大约1000行代码,这可能会使问题更容易发现。
你知道你可以在循环中创建小部件吗?通过使用一种非常简单的技术,您可以轻松地删除数百行代码。另外,你知道你可以改变现有标签的颜色而不破坏它并重新创建它吗?
最后,您不需要所有的StringVar实例,因为您只在其中存储一种颜色。一个普通变量就可以了。StringVars实际上只在您试图将两个或多个小部件的标签或值绑定在一起时才有用。如果您想将单元格颜色存储在变量中,则将它们存储在用于标签的相同数据结构中,然后您的redraw函数只需执行一次循环即可将每种颜色应用于每个单元格。
例如,要将所有初始颜色设置为"宝蓝色",您可以这样做:我用的是字典,但你也可以用列表的列表:
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
方法检索标签的背景颜色。例如,这将打印"red":
print cell[(0,0)].cget("background")
使用所有这些技术可以将代码减少到几百行,这将使您更容易发现任何错误。