运行以下代码(从1修改)
import tkinter as tk
import time
import os
class App():
def __init__(self):
self.root = tk.Tk()
self.label = tk.Label(text="")
self.label.pack()
self.update_clock()
self.root.mainloop()
def update_clock(self):
now = time.strftime("%H:%M:%S")
self.label.configure(text=now)
print(now)
print (os.times())
self.root.after(1000, self.update_clock)
app=App()
随着时间的推移略微增加CPU负载。在下面的例子中,在1分钟内从0.1到0.2
17:15:49
nt.times_result(user=0.0780005, system=**0.1092007**, children_user=0.0, children_system=0.0, elapsed=0.0)
17:16:49
nt.times_result(user=0.0780005, system=**0.2184014**, children_user=0.0, children_system=0.0, elapsed=0.0)
从长远来看,这会阻碍一切。
如何克服这种行为?
有没有更好的解决方案在tkinter“永远”显示时钟?
答案 0 :(得分:0)
os.times()
返回一个5元组的浮点数,表示累计(处理器或其他)时间,以秒为单位。这些项目包括:用户时间,系统时间,孩子的用户时间,孩子的系统时间,以及自上一个固定点以来经过的实际时间。请参阅Unix手册页时间(2)或相应的Windows Platform API文档。在Windows上,只填充前两个项目,其他项目为零。
元组中的第二个浮点是system time
并且根据this page system time
== clock_t tms_stime
tms_stime
字段包含代表调用进程执行任务时在系统中花费的CPU时间。
根据系统时间的WIKI,python返回的值是在μs
中测量的。 1 μs == One millionth of one second
所以这些数字即使它们正在增长也不应该真正影响系统性能。
此外,Windows可能会根据WIKI返回1 ms
或100 ns
个值。 1 ns == One billionth of one second
1 ms = One thousandth of one second
。也是数字太小而无法真正发挥作用。
更新:
经过一些测试后,我发现每个操作system time
的增加都发生在更新tkinter小部件上。我确实尝试了标签和输入字段。我确实确认system time
显示的值是处理该方法所花费的时间。我测试了打印os.times()
只是为了查看system time
是否与更新标签具有相同的增长而不是。
我会继续寻找能找到的东西。
我认为如果在函数的每个循环上调用相同数量的代码行,则应记录相同数量的处理时间。可能由于系统响应时间而略有变化,但我不应该看到这个响应时间的缓慢而持续的增长。
只有在更新tkinter小部件(例如Entry
,Label
和Text
时才会发生接缝。当我将这些值打印到控制台时,system time
永远不会上升。