Периодически вызывать функцию в главном цикле pygtk - PullRequest
6 голосов
/ 05 сентября 2011

Что такое эквивалент pygtk для метода after в tkinter?

Я хочу периодически вызывать функцию в основном цикле.

Какой лучший способ добиться этого?

Ответы [ 2 ]

15 голосов
/ 05 сентября 2011

Используйте gobject.timeout_add :

import gobject
gobject.timeout_add(milliseconds, callback)

Например, вот индикатор выполнения, который использует timeout_add для обновления значения прогресса (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()
1 голос
/ 25 марта 2017

Если вы используете новый Python GObject Introspection API , вы должны использовать GLib.timeout_add().

Обратите внимание, что документация кажется неверной. Это на самом деле:

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

Вот пример. Обратите внимание, что run является вызываемым объектом, но это может быть любая обычная функция или метод.

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()

Выход:

$ 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)
<messages stop but main loop keeps running>
...