如何正确地使用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(),它也冻结了。
答案 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秒,则会调用一个函数。如果创建了一个永久运行的函数,则该主循环将不会继续,因为它正在等待函数完成。这就是应用程序冻结的原因。