如何在 Tkinter Python 中显示的 2 条短信之间添加延迟?

Posted

技术标签:

【中文标题】如何在 Tkinter Python 中显示的 2 条短信之间添加延迟?【英文标题】:How to add a delay between 2 text messages being displayed in Tkinter Python? 【发布时间】:2021-07-22 17:18:30 【问题描述】:

所以我的目标是使用单个函数在单击按钮时显示文本消息。然后应该有一个延迟,然后应该显示另一条短信。

该游戏是一个骰子游戏,单击按钮时应显示“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()

任何帮助将不胜感激!

【问题讨论】:

附带建议,randint(1, SIDES)randrange(SIDES)+1 更具描述性。 【参考方案1】:

问题是当你在函数中sleep 时,tkinter 主循环被中断并且屏幕没有更新。 (window.after() 在这里只是一个美化的睡眠)。正确的解决方法是给after传递一个回调,让它立即返回,稍后再调用回调:


def func():
    display["text"] = "Rolling..."
    window.after(2000, lambda: display.__setitem__("text", str(randrange(SIDES) + 1)))

(请注意,对__setitem__ 的调用是直接的单行lambda 转换。这不是好的设计。)

【讨论】:

您可以使用window.after(2000, setattr, display, "text", randrange(SIDES) + 1)setattr 是一个预定义的 Python 函数,.after 方法接受任意数量的参数并传递它们【参考方案2】:

试试:

window.after(2000, lambda: display.config(text=randrange(SIDES) + 1))

而不是:

window.after(2000)
display["text"] = str(randrange(SIDES) + 1)

【讨论】:

以上是关于如何在 Tkinter Python 中显示的 2 条短信之间添加延迟?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 tkinter/ttk 在 Python 3 中显示图像?

python中tkinter treeview如何获取选中的条目

如何在tkinter python的状态栏中显示行号和列号

如何使用 matplotlib 在 python tkinter 中显示与屏幕分辨率无关的数字?

如何在 tkinter 中显示函数的值?

Python 2.7 Tkinter标签虽然有效但未显示