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

时间:2019-06-09 13:20:41

标签: python tkinter sleep

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

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

我想要什么: 每次调用.after()时,GUI都会在每次迭代后更新。

我已经尝试过与下面的代码类似的代码,方法是在每次迭代后调用该类,但是它仍然冻结。

// 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(),它也冻结了。

1 个答案:

答案 0 :(得分:1)

您发布的时钟应用程序可以正常工作,您可以用相同的方式进行所有操作。 (基本上,我摆脱了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))

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