Program zawiesza się po dodaniu time.sleep()

Program zawiesza się po dodaniu time.sleep()
Adam Szumacher
  • Rejestracja:prawie 5 lat
  • Ostatnio:2 miesiące
  • Postów:35
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

Kopiuj
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)


edytowany 2x, ostatnio: Adam Szumacher
RG
poszukaj również na tym forum: python after tkinter
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:3 minuty
  • Postów:8423
0

Adam Szumacher
  • Rejestracja:prawie 5 lat
  • Ostatnio:2 miesiące
  • Postów:35
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

RG
Wrzuć tu zmienione źródełko.
kbi64
  • Rejestracja:około 18 lat
  • Ostatnio:8 miesięcy
  • Lokalizacja:Wielkopolska
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.

Adam Szumacher
  • Rejestracja:prawie 5 lat
  • Ostatnio:2 miesiące
  • Postów:35
0

@kbi64:

Kopiuj
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)



kbi64
dokładnie jak @LukeJL pisze, a ja nie dostałem powiadomienia o wzmiance i nowym poście :(
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:3 minuty
  • Postów:8423
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:

Kopiuj
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.


edytowany 1x, ostatnio: LukeJL

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.