1

私の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()
4

1 に答える 1

1

次の例では、tick関数は毎秒呼び出されます。キーまたはマウスボタン ​​1 が押されていない限り、5 秒後にメッセージが出力されます。

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()
于 2012-10-08T13:04:34.847 に答える