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