2012-02-09 3 views
3

pyGtk + Gladeを使ってPythonでアプリケーションを開発しています。Pythonの非ブロックタイマー

私は関数を(JavaScriptのfunction setTimeout()のように)N秒ごとに実行したいと思います。ユーザーがクリックを実行する場合は、何らかの処置を行う必要があり、タイマーをリセットする必要があります。

私は、threading.Timerにしようと、このような何かた:

def callback(): 
    print "callback executed" 

t = threading.Timer(10.0, callback) 
t.start() 

それNの秒のためのブロックのすべてと、ユーザーのクリックをキャプチャしていないので、それは私のために動作しません。

他のオプションはありますか?

+0

おそらく、新しいスレッドを作成し、そのスレッドにタイマーを設定した方が、もっと成功する可能性がありますか?そうすることで、ブロックしているときにメインに戻ることができ、プログラムの実行はそれに沿って続くことができます。 – chucksmash

答えて

0

これはMainWin.update()秒ごとに呼び出してタイマーを作成します。しかし、あなたはみかん、このようなタイムアウトリセットは、ときを管理しているので、独自のメインループを作成することができます。ボタンを押すと、現在のタイマーが終了し、新しいタイマーが開始されます。

import pygtk 
pygtk.require('2.0') 
import gtk 
import gobject 
import time 

class MainWin(object): 
    def destroy(self, widget, data=None): 
     gtk.main_quit() 
    def __init__(self): 
     self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     self.window.connect("destroy", self.destroy) 
     self.window.set_border_width(10) 
     self.button = gtk.Button("Reset") 
     self.button.connect("clicked", self.onclick) 
     self.window.add(self.button) 
     self.button.show() 
     self.window.show() 
     self.reset_timer = False 
     self.count = 0 
     self.duration = 1000 
     self.timer = gobject.timeout_add(self.duration, self.update) 
    def reset(self): 
     print('Resetting timer') 
     gobject.source_remove(self.timer) 
     # start a new period call to update 
     self.count = 0   
     self.timer = gobject.timeout_add(self.duration, self.update) 
    def onclick(self, widget): 
     # Every action which resets the timer should call self.reset_timer(). 
     self.reset() 
    def update(self): 
     print('{t:.1f}: count = {i}'.format(t=time.time() % 100, i=self.count)) 
     self.count += 1 
     return True 
    def main(self): 
     gtk.main() 

if __name__=='__main__': 
    MainWin().main() 
+0

ありがとうございました。素晴らしい例 – jeanc

+0

'timeout_add'はsuspendで正常に動作しません。 'threading.Timer'はPyGtkでも正しく動作していないようです。私はまだPyGtkで長時間のタイマー/スケジューリングを設定する方法がわかりません... – saeedgnu

2

PyGTKを使用しているので、g_main_loopを使用している可能性があります。この場合、glib.timeout_add(interval、callback)を呼び出して、コールバックをX秒ごとに呼び出すことができます。ここで

は例です:残念ながら

import glib 
import gtk 

def yo(): 
    print "yo" 
    return True 

glib.timeout_add (1000, yo) 
gtk.main() 

、私はエレガントな解決策を考え出すことができなかったタイムアウトをリセットします。

import glib 
import gtk 
import time 

timeout = 1; 
timer = time.time() + timeout 
while (True): 
    gtk.main_iteration (False) 
    if (timer <= time.time()): 
     print "Time up!" 
     timer = time.time() + timeout 
+0

実際に私はtimeout_addで作業を始めました。うまくいきましたが、ユーザーがクリックをしたときにタイマーをリセットする部分を達成できませんでした。それについていくつかアドバイスをいただけますか? – jeanc

+0

ご協力いただきありがとうございます。 'gobject.remove_source(timer_id)'と 'gobject.timeout_add(TIME、FUNC) 'を使用してタイマーを削除/追加することで解決しました。 – jeanc

+0

' timeout_add'は長期間(1時間以上など)なぜなら、あなたがコンピュータをサスペンドすると、タイマーが台無しになるからです。 – saeedgnu

関連する問題