Program zawiesza się po dodaniu time.sleep()

0

Witam piszę prostą gierkę dla nauki Tkintera. Chciałem zrobić wyświetlanie procentów w taki sposób jakby się ładowały lecz niestety po dodaniu time.sleep() program zawiesza się. Czy ma ktoś pomysł czemu tak się dzieje i jak to rozwiązać? Bez używania time.sleep() program śmiga i wszystko wyświetla

def take():
    nameGet = name1.get()
    nameGet2 = name2.get()
    sign = "%"
    if(len(nameGet2) and len(nameGet2) >0):
        percent = random.randrange(0, 101)
        for i in range(0, percent):
            ix = str(i) + "%"
            labelPercentText = Label(root, text=ix, background="#fc4f4f", font=('sanserif', 15))
            labelPercentText.place(x=425, y=200)
            time.sleep(2)
    else:
        labelPercentText = Label(root, text="0%", background="#fc4f4f", font=('sanserif', 15))
        labelPercentText.place(x=425, y=200)


0
LukeJL napisał(a):

tu coś piszą, żeby after używać zamiast sleepa, jak się używa Tkintera:
https://stackoverflow.com/questions/10393886/tkinter-and-time-sleep
https://www.geeksforgeeks.org/python-after-method-in-tkinter/

niestety nie działa after. Również zawiesza program

0

Pokaż kod z wykorzystaniem after, inaczej time.sleep w pętli for nie pójdzie w tkinterze bo zawieszają się wszystkie elementy aktualnie wykonywane.

0

@kbi64:

def take():
    nameGet = name1.get()
    nameGet2 = name2.get()
    sign = "%"
    if(len(nameGet2) and len(nameGet2) >0):
        percent = random.randrange(0, 101)
        for i in range(0, percent):
            ix = str(i) + "%"
            labelPercentText = Label(root, text=ix, background="#fc4f4f", font=('sanserif', 15))
            labelPercentText.place(x=425, y=200)
            labelPercentText.After(2000,labelPercentText.destroy())
    else:
        labelPercentText = Label(root, text="0%", background="#fc4f4f", font=('sanserif', 15))
        labelPercentText.place(x=425, y=200)



1
Adam Szumacher napisał(a):

labelPercentText.After(2000,labelPercentText.destroy())

Ta metoda się nazywa after, a nie After
Poza tu nawiasy niechcący (albo bezmyślnie) dałeś: labelPercentText.destroy(). Ty masz podać funkcję jako argument, a nie ją wywołać od razu, czyli:

labelPercentText.after(2000, labelPercentText.destroy)

druga sprawa, że ta metoda ustawia callback, a nie blokuje działania programu, więc twoja logika jest niepoprawna, bo jeśli to zadziała to od razu wszystkie labelki się skasują mniej więcej w podobnym czasie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1