#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
метод принимает любое количество аргументов и передает их