我是Tkinter的新手,在此之前只开发了一个GUI。我决定创建一个随机地形生成器,使用标签来表示一个10 x 10网格的块。我已经完成它并修复了内存泄漏,制作了大量标签。我还实现了一个随机按钮和滚动。然而,在大约100(我检查的最后一次检查)网格的更新之后,它将出现在窗口外面出现灰框并且世界的顶部将显示为灰色,然后程序将停止响应。没有错误消息,所以我不知道如何解决这个问题。代码位于:http://pastebin.com/SASFuQCZ上的pastebin,虽然它很长。任何帮助解决这个问题将不胜感激。感谢。
答案 0 :(得分:0)
也许别人可以搞清楚,但对我来说,你的代码太难理解了。但是,即使我无法解决问题,我也可以提供一些建议,可能会帮助您删除大约一千行代码,这可能会使问题更容易被发现。
您是否知道可以在循环中创建小部件?您可以使用一种非常简单的技术轻松删除几百行代码。另外,您是否知道可以更改现有标签的颜色而不会破坏它并重新创建它?
最后,您不需要所有StringVar实例,因为您只在其中存储颜色。一个普通的变量就可以了。 StringVars实际上只在您尝试将两个或多个小部件的标签或值组合在一起时才有用。如果要将单元格颜色存储在变量中,请将它们存储在用于标签的相同数据结构中,然后重绘功能只需要执行一个循环即可将每种颜色应用于每个单元格。
例如,要将所有初始颜色设置为“皇家蓝”,您可能会执行以下操作。我使用字典,但您可以轻松地使用列表列表:
color = {}
for row in range(10):
for column in range(10):
color[(row, column)] = "royal blue"
接下来,您可以使用相同的简单循环创建10x10标签的网格。这可以替换200行代码(加上另外100行空白行),用于创建只有6行代码的原始标签。
# 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")
使用所有这些技术可能会将您的代码缩减到几百行,这将使您更容易发现任何错误。