import tkinter as tk
import time
class Example(tk.Toplevel):
def __init__(self, root):
tk.Toplevel.__init__(self, root)
self.canvas = tk.Canvas(self, borderwidth=0, background="#ffffff")
self.frame = tk.Frame(self.canvas, background="#ffffff")
self.vsb = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
self.vsb.pack(side="right", fill="y")
self.canvas.pack(side="left", fill="both", expand=True)
self.canvas.create_window((4,4), window=self.frame, anchor="nw",
tags="self.frame")
self.frame.bind("<Configure>", self.onFrameConfigure)
self.populate()
self.l= tk.Label(self.frame, text= 1)
self.l.grid()
self.cb= tk.Button(self.frame, text= "asdf", command= self.cnt)
self.cb.grid()
def cnt(self):
slowlist= []
slow= 0
for x in range(10000):
now= time.time()
self.l["text"]+=1
end= time.time()
if end-now >= 0.001:
slow+=1
slowlist.append(end-now)
print (slow)
print (slowlist[:5])
def populate(self):
'''Put in some fake data'''
for row in range(100):
tk.Label(self.frame, text="%s" % row, width=3, borderwidth="1",
relief="solid").grid(row=row, column=0)
t="this is the second column for row %s" %row
tk.Label(self.frame, text=t).grid(row=row, column=1)
def onFrameConfigure(self, event):
'''Reset the scroll region to encompass the inner frame'''
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
if __name__ == "__main__":
root=tk.Tk()
Example(root)
root.mainloop()
以上是我的代码,大部分代码来自this post。而且我担心,当我使用self.l [“ text”] + = 1重复更新标签文本时,在极少数情况下(大约10000个更新中有70个实例),大约需要0.11秒来更新标签文本,而其余的迭代则快得多。
我想知道a)为什么在某些情况下更新会变得相当慢?尤其是当在每次10000次迭代中大约有70个慢速情况似乎很稳定时,我想知道“恒定”时间漂移是否有任何原因。和b)在运行需要频繁更新标签文本的大型迭代循环时,如何避免这些慢速实例?
答案 0 :(得分:0)
我仍然不确定开销的原因以及如何解决它,但是这是减少影响的部分方法。
因此,我们知道在10000次连续运行中大约有70个慢速案例,我发现此结果实际上与所执行的运行数量成正比。简单来说,大约每执行140次tkLabelObject [“ text”] =“ value reassignment”,就会出现一个缓慢的执行过程,以至于需要0.01秒才能重新分配值并显示在GUI上(考虑一下其他139个执行时间已经过去了无法在1xe-07的时间范围内捕获,0.01秒的执行速度明显慢)。
因此,要减少这种影响,就要在每执行130次执行后短暂休息一下。因此,执行以下操作可以避免在更新tkLabel文本10000次时出现“缓慢的情况”(好,示例代码仅更新9100次,但是我们只需要在第一个for循环中更改范围值即可进行调整)
import time
for x in range(70):
time.sleep(0.0000000001)
for x in range(130):
tkLabelObj["text"]= "value reassignment"
但是,这绝不是最佳实践。如前所述,我认为这只是解决更优雅的解决方案的一种方法。