Tkinter Label () отображение постепенно замедляется во время цикла с использованием update () - PullRequest
0 голосов
/ 14 декабря 2018

Моя цель - активировать цикл нажатием кнопки, чтобы индекс (количество) отображался в поле по мере его увеличения.Цикл должен иметь одинаковое время выполнения (для данного счетчика) независимо от того, сколько раз нажата кнопка.

Следующая функция do_the_loop () делает это хорошо - с одной проблемой: цикл замедляетсяпостепенно уменьшается по мере увеличения абсолютного счета (после одного нажатия кнопки и продолжается более одного нажатия кнопки).Время, необходимое для выполнения функции более или менее, удваивается при каждом выполнении (нажатие кнопки).Я рассчитал части цикла "Label (...). Place (...)" и "update ()", чтобы определить источник замедления, и, похоже, он находится в "update ()".ОДНАКО, перемещая функцию «update ()» из цикла «while», происходит примерно такое же замедление, даже если «update ()» выполняется только один раз за цикл вместо 1000 раз.(Попробуйте: закомментируйте «root.update ()» в цикле while и снимите комментарий выше «count = 1»).В этих условиях цикл while выполняется примерно за треть секунды последовательно.Следовательно, проблема, похоже, не в «update ()» как таковой.Кажется, там где-то прячется гремлин, и я скучаю по нему.

Буду признателен за любой свет, который кто-нибудь может осветить в этом вопросе.Я использую Python 3.7.1 и Windows 10. Спасибо.

    from tkinter import *
    import time

    root = Tk()

    root.title("Slowdown Problem")
    root.geometry("300x250+1335+0")
    root.configure(background="lightgray")

    def do_the_loop():
        # Erases the count when button is pressed
        canvas = Canvas(root, height= 30, width=60, bg="powderblue")
        canvas.place(x=115, y=145)

        #root.update()     

        count = 1
        total_count = 1000

        start = time.perf_counter()

        while count <= total_count:                
            Label(root, height=1, width=5, anchor=E, background="powderblue",  
                  text=str(count),
                  fg="red", font=("Arial Black", 10)).place(x=120, y=150)

            root.update()    # Update the display with each count

            count += 1

        print("Count:", count, "  Loop time:", str(time.perf_counter() - start))

    #======================== CREATE GO BUTTON ==============================
    Button(root, text="  GO  ", font=("Arial Black", 20), bd=7, command=do_the_loop,
       bg="light green", height=2, width=7).place(x=70, y=20)    

    root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...