如何使用 tkinter .after() 方法创建延迟

How to use tkinter .after() method to create delay

如何正确使用 tkinter 中的 .after() 在迭代之间创建延迟,而不冻结整个程序,直到所有迭代完成。

问题示例: 总共 10 次迭代,直到 10 次迭代完成后,GUI 才会更新

我想要的: 调用 .after() 时,每次迭代后更新 GUI。

我尝试了与下面的代码类似的代码,在每次迭代后调用 class,但它仍然冻结。

// example of a similar code i tried
import Tkinter as tk
import time

class App():
def __init__(self):
        self.root = tk.Tk()
        self.label = tk.Label(text="")
        self.label.pack()
        self.update_clock()
        self.root.mainloop()

def update_clock(self):
        now = time.strftime("%H:%M:%S")
        self.label.configure(text=now)
        self.root.after(1000, self.update_clock)

app=App()

// example of my current code
self.board = [1,1,1,1,1,1]

def updateBoard(self, seed, move):
    while seed > 0:
        self.board[move] += 1
        seed = seed - 1
        move = move + 1
        // here i call the function to delay the execution for 1s
        self.createDelay()
        self.displayBoard()

p.s。我试过 time.sleep(),它也冻结了。

您发布的时钟应用程序运行良好,您可以按照相同的方式执行所有操作。 (基本上我摆脱了 while 循环,它会在你的应用程序执行时冻结它)

def updateBoard(self, seed, move):
    if seed <= 0:
        return
    self.board[move] += 1
    seed = seed - 1
    move = move + 1
    self.displayBoard()
    # call this function with parameters seed and move after 1000 ms
    root.after(1000, lambda: updateBoard(seed, move))

为何如此有效:在主循环中,您的 window 处理一些事件,或者在这种情况下,如果经过 1 秒则调用一个函数。如果你创建一个永远运行的函数,这个主循环将不会继续,因为它正在等待你的函数完成。这就是应用程序会冻结的原因。