在使用update()的循环中,Tkinter Label()的显示逐渐变慢

时间:2018-12-14 02:15:58

标签: python tkinter

我的目标是通过按下按钮来激活循环,​​并在其增加时将索引(计数)显示在框中。不管按下按钮多少次,循环都应具有相同的执行时间(对于给定的计数)。

以下“ do_the_loop()”函数很好地完成了一个问题:循环随着绝对计数变大而逐渐减慢(按下一个按钮并持续按下多个按钮)。函数每次执行(按钮按下)执行或多或少两次的时间。我已经对循环的“ Label(...)。place(...)”和“ update()”部分进行了计时,以确定减速的源头,它似乎在“ update()”中。但是,通过将“ update()”函数移出“ while”循环,即使“ update()”每次运行仅执行一次而不是执行1000次,也会出现大致相同的速度下降。 (尝试一下:在“ while”循环中注释掉“ root.update()”,然后在“ count = 1”上方取消注释)。在这些条件下,“ while”循环将在大约三分之一秒的时间内持续执行。因此,问题似乎并不是“ update()”本身。似乎在某处藏有一颗葛雷姆林,我很想念它。

任何人都能在此问题上大放异彩,我将不胜感激。我正在使用Python 3.7.1和Windows10。谢谢。

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

0 个答案:

没有答案