【发布时间】:2012-12-10 05:03:40
【问题描述】:
我们在事件回调中有一些代码,如下所示:
...
self.position.side = -self.position.side
self.update_with_board() # displays self.position graphically
ai_move = self.brain.get_move(self.position)
...
update() 被立即调用,但直到 ai_move 行才影响 GUI。
但是,当我这样做时:
...
self.position.side = -self.position.side
self.update_with_board() # displays self.position graphically
raw_input()
ai_move = self.brain.get_move(self.position)
...
它会在请求输入时立即以图形方式更新。我不知道该怎么做:也许是时髦的懒惰评估或我不知道的 tkinter 调度事情?如何让 GUI 按指定的顺序而不是延迟更新?
编辑:抱歉,我没有使用内置的update() 方法,而是我定义的一种用于绘制的方法。我将其重命名为 update_with_board(),并看到相同的行为。
def update_with_board(self):
for i in range(8):
for j in range(8):
color = "gray" if (i+j) % 2 else "white"
self.canvas.create_rectangle(self.square * i, self.square * j, self.square * (i+1), self.square * (j+1), fill=color)
if self.position.board[8 * j + i] in self.ims.keys():
self.canvas.create_image(self.square * i + self.square/2,
self.square * j + self.square/2, image = self.ims[self.position.board[8 * j + i]])
【问题讨论】:
-
引用
update上的文档:“绝不应该从事件回调或从事件回调调用的函数中调用它。”我相信 TkInter 试图在这里保护你免受无限递归;否则,没有什么可以阻止update重新进入租用您的处理程序的主事件循环……如果您使用update_idletasks,那行得通吗? (这里可能不是您想要的,但检查调试很有用。) -
看起来每次调用
update_with_board时,您都在创建 64 个新图像和 64 个新矩形,而不是删除任何旧图像。我读对了吗?这就是所谓的内存泄漏。如果您正在创建某种棋盘游戏,则实际上没有理由每次要更新棋盘时都创建新对象-您只需更改现有项目的属性即可。