Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

nonblocking timer in python

Tags:

python

I am developing an app in python with pyGtk+Glade.

I want to execute a function every N seconds (just like in javascript the function setTimeout()). If the user perform a click, some action must be done, and the timer must be reset.

I was trying with threading.Timer, something like this:

def callback():
    print "callback executed"

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

but it doesn't work for me because it blocks everything for the N secs and doesn't capture the user click.

Any other option?

like image 886
jeanc Avatar asked Apr 24 '26 12:04

jeanc


1 Answers

Since you're using PyGTK, your program should probably be using the g_main_loop, in which case you can call glib.timeout_add (interval, callback) to add a callback that gets called (roughly) every X seconds.

Here's an example:

import glib
import gtk

def yo ():
    print "yo"
    return True

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

Unfortunately, to reset the timeout I couldn't come up with an elegant solution. But you can create your own main loop so you have control over when the timeout resets, sorta like this:

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
like image 58
Bren Avatar answered Apr 26 '26 03:04

Bren



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!