我的基于Tkinter的程序需要定期执行一些“繁重”的维护功能。 由于它是一个持续运行的程序,我只想在一定时间内启动这些功能。
你是如何在Tkinter做的?我在http://etutorials.org/Programming/Python+tutorial/Part+III+Python+Library+and+Extension+Modules/Chapter+16.+Tkinter+GUIs/16.9+Tkinter+Events/中找到了关于after_idle的内容,但是当事件循环空闲时,它只被称为 。我需要它来运行我的功能,比如说,在闲置10分钟之后。
~~~
Mr.Steak给出了我需要的答案 - 我只是稍微修改了一下,以便能够使用 idletime 变量以不同的间隔执行不同的任务:
import time
from Tkinter import *
root = Tk()
def resetidle(*ignore):
global idletime
for k in idletime: k['tlast']=None
def tick(*ignore):
global idletime
t=time.time() # the time in seconds since the epoch as a floating point number
for k in idletime:
if not k['tlast']:
k['tlast'] = t
else:
if t-k['tlast']>k['tmax']:
k['proc']()
k['tlast'] = None
root.after(5000, tick) # reset the checks every 5''
idletime=[{'tlast':None,'tmax':60,'proc':test1}, # every 1'
{'tlast':None,'tmax':3600,'proc':test2}] # every 1h
root.after(5000, tick)
root.bind('<Key>', reset)
root.bind('<Button-1>', reset)
root.mainloop()
答案 0 :(得分:1)
在以下示例中,每秒调用tick
函数。 5秒钟后,除非按下键或鼠标按钮1,否则将打印一条消息。
import time
from Tkinter import *
root = Tk()
running = None
def reset(*ignore):
global running
running = None
def tick(*ignore):
global running
if not running:
running = time.time()
elif time.time() - running > 5:
print 'I waited 5 seconds...'
running = None
root.after(1000, tick)
root.after(1000, tick)
root.bind('<Key>', reset)
root.bind('<Button-1>', reset)
root.mainloop()