【发布时间】:2017-08-20 14:02:48
【问题描述】:
下面的方法旨在显示数独在画布上的回溯解决方案的演变。
findAnswer() 函数将返回一个 9x9 的列表,其中包含数独的原始布局给 self.original 和一个 9x9 列表的列表给 self。 btSolution,由回溯解的所有迭代组成。
问题在于,它不是在画布上显示所有迭代,而是循环遍历所有内容,只显示最后一个。我调试并检查了 self.board.create_text() 确实每次都使用正确的参数被调用,但只在最后一次调用时显示画布上的数字。
def create_gif(self):
self.original, self.btSolution = findAnswer(self.sudoku, gif=1)
for sudoku in self.btSolution:
time.sleep(0.1)
self.board.delete("gifNumbers")
for row in range(9):
for col in range(9):
if sudoku[row][col] != 0:
x = row * CELL + 0.5 * CELL
y = col * CELL + 0.5 * CELL
color = "red" if sudoku[row][col] == self.original[row][col] else "black"
self.board.create_text(x, y, text=sudoku[row][col], fill=color, tags="gifNumbers")
【问题讨论】:
-
Tkinter 不能很好地与
time.sleep配合使用。通常,Tkinter 窗口不会更新新内容,直到您的函数完成执行并且控制返回到主循环。因此,如果您在self.btSolution中有一百个项目,并且在每个项目之间睡眠 0.1 秒,那么窗口将完全冻结十秒,然后最终显示最后创建的任何内容。您需要使用root.after或root.after_idle来获得定期更新的行为。 -
这完美地描述了正在发生的事情。我将研究建议的替代方案。非常感谢!
-
root.after似乎也发生了同样的问题。有什么新建议吗?我这样调用循环:for sudoku in self.btSolution: root.after(100, self.plotBTSolution(sudoku))
标签: python python-3.x canvas tkinter tkinter-canvas