Как реализовать появление 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 шт):

Автор решения: dllx

Проблема в том что root.mainloop() вызывается после label() так как label() не асинхронная функция потому создайте кнопку которая вызовет функцию label() и исчезнет

→ Ссылка
Автор решения: S. Nick

Используйте метод 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()

введите сюда описание изображения

→ Ссылка