有没有办法用文本更新 Tkinter canvas live?

Is there a way to update Tkinter canvas live with text?

我正在尝试使用 Tkinter 可视化回溯算法来解决数独游戏(示例视频:https://www.geeksforgeeks.org/building-and-visualizing-sudoku-game-using-pygame/

    def play_puzzle(self):
        self.play_frame.pack_forget()
        self.home_frame.pack_forget()
        self.play_frame.pack(fill=BOTH, expand=1)

        self.canvas = Canvas(self.play_frame, width=WIDTH, height=HEIGHT)
        self.canvas.grid(row=0, column=0, columnspan=9, rowspan=9)

        self.canvas.bind("<Button-1>", self.cell_clicked)
        self.canvas.bind("<Key>", self.key_pressed)

        solution_btn = ttk.Button(self.play_frame, text='Solution', command=self.solve_puzzle)
        home_btn = ttk.Button(self.play_frame, text='Home', command=lambda: self.return_home('play'))
        clear = ttk.Button(self.play_frame, text='clear', command = lambda: self.canvas.delete('numbers'))
        view_solution_btn = ttk.Button(self.play_frame, text='View Solution', command=self.view_solution)

        solution_btn.grid(row= 1, column = 11)
        home_btn.grid(row = 3, column = 11)
        clear.grid(row=5, column = 11)
        view_solution_btn.grid(row=7, column = 11)

        self.draw_grid()
        self.draw_puzzle()

    def view_solution(self):
        find = self.game.find_empty()
        if not find:
            print('Solution found')
            return True
        else:
            e_row, e_col = find

        for i in range(1,10):
            if self.game.is_valid(i, e_row, e_col):
                self.game.puzzle[e_row][e_col] = i
                
                self.play_puzzle()
                time.sleep(1)

                if self.view_solution():
                    return True

                self.game.puzzle[e_row][e_col] = 0

        return False

    def draw_puzzle(self):
        self.canvas.delete("numbers")
        for i in range(9):
            for j in range(9):
                answer = self.game.puzzle[i][j]
                if answer != 0:
                    x = MARGIN + j * SIDE + SIDE / 2
                    y = MARGIN + i * SIDE + SIDE / 2
                    original = self.game.start_puzzle[i][j]
                    color = "black" if answer == original else "sea green"
                    self.canvas.create_text(x, y, text=answer, tags="numbers", fill=color)

    def draw_grid(self):
        for i in range(10):
            color = 'blue' if i%3==0 else 'gray'
            
            x0 = MARGIN + i*SIDE
            y0 = MARGIN
            x1 = MARGIN + i*SIDE
            y1 = HEIGHT - MARGIN

            self.canvas.create_line(x0,y0,x1,y1, fill=color)

            x0 = MARGIN
            y0 = MARGIN + i*SIDE
            x1 = WIDTH-MARGIN
            y1 = MARGIN + i*SIDE

            self.canvas.create_line(x0,y0,x1,y1, fill=color)

当我在上面的代码片段中调用 view_solution 函数时(通过单击查看解决方案按钮),它不会在每次运行时更新 canvas 而是输出 answer/fills 完成整个循环后的解谜题。有什么方法可以使它像视频中显示的那样工作吗?

我试过在 Tkinter 中使用 .after() 函数,但我不确定如何完美地实现它。

完整代码在这里 - https://github.com/ssram4298/sudoku_gui_tkinter

有几种方法可以在处理时更新 canvas。

root.update() #self.parent.update() in your code
root.update_idletasks() #self.parent.update_idletasks() in your code

您还可以通过调用 update() 来更新单个小部件 (myButton.update())。

如果您需要处理小部件上的更改,则需要在呈现之前对其进行更新。