Как реализовать появление label после time.sleep()?
import random
from tkinter import *
import ctypes, time
user32 = ctypes.windll.user32
user32.SetProcessDPIAware()
[w, h] = [user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)]
x, y = w//2, h//2
w = round(w//1.5)
h = round(h//1.5)
x = x - w//2
y = y - h//2
root = Tk()
root.title("Ziamond")
root.geometry(("{}x{}+{}+{}").format(w,h,x,y))
def label():
welcome = Label(root, text="Hello World", font=("Bahnschrift", 30))
welcome.pack(expand=True)
time.sleep(random.randint(2, 5))
welcome1 = Label(root, text="Loading...", font=("Bahnschrift", 30))
welcome1.pack(expand=True)
label()
root.mainloop()
В теории программа должна сначала показывать Hello world, а потом через 2-5 секунд Loading....
Но получается так, что сначала прогружаются все объекты и только потом появляется окно сразу с обеими объектами.
Я тоже сначала подумал, что это будет очень просто исправить, но просидев полтора часа я понял что без помощи не обойдусь.
Ответы (2 шт):
Проблема в том что root.mainloop() вызывается после label() так как label() не асинхронная функция потому создайте кнопку которая вызовет функцию label() и исчезнет
Используйте метод Tkinter after() для планирования действия по истечении тайм-аута.
Метод after() вызывает функцию обратного вызова один раз после задержки в миллисекундах (мс)
в основном цикле Tkinter.
import random
from tkinter import *
import ctypes, time
user32 = ctypes.windll.user32
user32.SetProcessDPIAware()
[w, h] = [user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)]
x, y = w//2, h//2
w = round(w//1.5)
h = round(h//1.5)
x = x - w//2
y = y - h//2
root = Tk()
root.title("Ziamond")
root.geometry(("{}x{}+{}+{}").format(w, h, x, y))
def label(val):
if val == "Hello":
welcome = Label(root, text="Hello World", font=("Bahnschrift", 30))
welcome.pack(expand=True)
# time.sleep(random.randint(2, 5))
else:
welcome1 = Label(root, text="Loading...", font=("Bahnschrift", 30))
welcome1.pack(expand=True)
root.after(100, lambda : label("Hello"))
root.after(random.randint(2, 5) * 1000, lambda : label("Loading"))
#label()
root.mainloop()
