Как добавить задержку между 2 текстовыми сообщениями, отображаемыми в Tkinter Python?

#python #function #tkinter #sleep

Вопрос:

Поэтому моя цель состоит в том, чтобы использовать одну функцию для отображения текстового сообщения при нажатии кнопки. Затем должна произойти задержка, а затем должно появиться другое текстовое сообщение.

Игра представляет собой игру в кости, которая должна показывать » Прокатку…» при нажатии кнопки. А затем, через некоторое время, на нем должно появиться случайное число.

Я попробовал и то, и другое .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()
 

Любая помощь будет очень признательна!

Комментарии:

1. Побочное предложение, randint(1, SIDES) более описательное, чем randrange(SIDES) 1 .

Ответ №1:

Попробуй:

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

вместо того, чтобы:

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

Ответ №2:

Проблема в том, что sleep при выполнении функции основной цикл tkinter прерывается и экран не обновляется. ( window.after() это просто злорадный сон здесь). Правильное решение-передать обратный after вызов , который заставит его немедленно вернуться и вызвать обратный вызов позже:

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

(Обратите внимание, что вызов __setitem__ является прямым однострочным лямбда-переводом. Это не очень хороший дизайн.)

Комментарии:

1. Вы можете использовать window.after(2000, setattr, display, "text", randrange(SIDES) 1) . setattr является предопределенной функцией python, и .after метод принимает любое количество аргументов и передает их