Periódicamente llamar a una función en el bucle principal de pygtk

¿Cuál es el equivalente de pygtk para el método after en tkinter?

Quiero llamar periódicamente a una función en el bucle principal.

¿Cuál es la mejor manera de lograrlo?

Utilice gobject.timeout_add :

import gobject gobject.timeout_add(milliseconds, callback) 

Por ejemplo, aquí hay una barra de progreso que usa timeout_add para actualizar el valor de progreso ( HScale ):

 import gobject import gtk class Bar(object): def __init__(self,widget): self.val=0 self.scale = gtk.HScale() self.scale.set_range(0, 100) self.scale.set_update_policy(gtk.UPDATE_CONTINUOUS) self.scale.set_value(self.val) widget.add(self.scale) gobject.timeout_add(100, self.timeout) def timeout(self): self.val +=1 self.scale.set_value(self.val) return True if __name__=='__main__': win = gtk.Window() win.set_default_size(300,50) win.connect("destroy", gtk.main_quit) bar=Bar(win) win.show_all() gtk.main() 

Si está utilizando la nueva API de introspección GObject de Python , debe usar GLib.timeout_add() .

Tenga en cuenta que la documentación parece ser incorrecta. En realidad es:

 timeout_add(interval, function, *user_data, **kwargs) 

Aquí hay un ejemplo. Tenga en cuenta que run es un objeto que se puede llamar , pero podría ser cualquier función o método ordinario.

 from gi.repository import GLib class Runner: def __init__(self, num_times): self.num_times = num_times self.count = 0 def __call__(self, *args): self.count += 1 print("Periodic timer [{}]: args={}".format(self.count, args)) return self.count < self.num_times run = Runner(5) interval_ms = 1000 GLib.timeout_add(interval_ms, run, 'foo', 123) loop = GLib.MainLoop() loop.run() 

Salida:

 $ python3 glib_timeout.py Periodic timer [1]: args=('foo', 123) Periodic timer [2]: args=('foo', 123) Periodic timer [3]: args=('foo', 123) Periodic timer [4]: args=('foo', 123) Periodic timer [5]: args=('foo', 123)