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