如何在 Tkinter Python 中显示的 2 条短信之间添加延迟?
How to add a delay between 2 text messages being displayed in Tkinter Python?
所以我的目标是使用单个函数在单击按钮时显示文本消息。然后应该有一个延迟,然后应该显示另一条短信。
该游戏是一个骰子游戏,点击按钮时应显示 'Rolling...'。然后过一会儿,它应该会显示一个随机数。
我尝试了 .sleep() 和 .after() 并且它们都导致我的程序不显示之前的延迟文本。这是我的代码:
# Imports
import tkinter as tk
from random import randrange
import time
# Global variables
# SIDES is a constant
SIDES = 12
# Functions
def func():
display["text"] = "Rolling..."
window.after(2000)
display["text"] = str(randrange(SIDES) + 1)
# Main program loop
window = tk.Tk()
display = tk.Label(window, text="Press the button \nto roll the dice.", width=20, height=3)
button = tk.Button(window, text="Roll", command=func)
display.pack()
button.pack(pady=10)
window.mainloop()
如有任何帮助,我们将不胜感激!
问题是当您在函数中 sleep
时,tkinter 主循环被中断并且屏幕没有更新。 (window.after()
只是美化了这里的睡眠)。正确的解决方案是将回调传递给 after
,这将立即 return 并稍后调用回调:
def func():
display["text"] = "Rolling..."
window.after(2000, lambda: display.__setitem__("text", str(randrange(SIDES) + 1)))
(请注意,对 __setitem__
的调用是直接的单行 lambda 转换。这不是好的设计。)
尝试:
window.after(2000, lambda: display.config(text=randrange(SIDES) + 1))
而不是:
window.after(2000)
display["text"] = str(randrange(SIDES) + 1)
所以我的目标是使用单个函数在单击按钮时显示文本消息。然后应该有一个延迟,然后应该显示另一条短信。
该游戏是一个骰子游戏,点击按钮时应显示 'Rolling...'。然后过一会儿,它应该会显示一个随机数。
我尝试了 .sleep() 和 .after() 并且它们都导致我的程序不显示之前的延迟文本。这是我的代码:
# Imports
import tkinter as tk
from random import randrange
import time
# Global variables
# SIDES is a constant
SIDES = 12
# Functions
def func():
display["text"] = "Rolling..."
window.after(2000)
display["text"] = str(randrange(SIDES) + 1)
# Main program loop
window = tk.Tk()
display = tk.Label(window, text="Press the button \nto roll the dice.", width=20, height=3)
button = tk.Button(window, text="Roll", command=func)
display.pack()
button.pack(pady=10)
window.mainloop()
如有任何帮助,我们将不胜感激!
问题是当您在函数中 sleep
时,tkinter 主循环被中断并且屏幕没有更新。 (window.after()
只是美化了这里的睡眠)。正确的解决方案是将回调传递给 after
,这将立即 return 并稍后调用回调:
def func():
display["text"] = "Rolling..."
window.after(2000, lambda: display.__setitem__("text", str(randrange(SIDES) + 1)))
(请注意,对 __setitem__
的调用是直接的单行 lambda 转换。这不是好的设计。)
尝试:
window.after(2000, lambda: display.config(text=randrange(SIDES) + 1))
而不是:
window.after(2000)
display["text"] = str(randrange(SIDES) + 1)