【问题标题】:Python tkinter - failing to repetitively create text on canvas on loopPython tkinter - 无法在画布上循环重复创建文本
【发布时间】: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.afterroot.after_idle 来获得定期更新的行为。
  • 这完美地描述了正在发生的事情。我将研究建议的替代方案。非常感谢!
  • root.after 似乎也发生了同样的问题。有什么新建议吗?我这样调用循环:for sudoku in self.btSolution: root.after(100, self.plotBTSolution(sudoku))

标签: python python-3.x canvas tkinter tkinter-canvas


【解决方案1】:

听起来你在“findAnswer”方法的某个地方使用了如下代码:

new_answer = original # make a copy

并且没有意识到该代码不会复制;它提供了一个新的参考。要复制 2D 列表,您需要 deepcopy 函数:

from copy import deepcopy
...
new_answer = deepcopy(original) # make a copy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 2017-07-27
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 2015-02-09
    • 2019-12-06
    相关资源
    最近更新 更多