在pygtk主循环中周期性调用函数
在tkinter中,有一个叫做after的方法,用来定期调用一个函数。那么在pygtk中,有没有类似的功能呢?
我想在主循环中定期执行一个函数。
有什么更好的方法来实现这个吗?
3 个回答
0
这是最简单的测试代码
// 基于Jonathon Reinhart的回答
from gi.repository import GLib
i = 0
def test1(*args):
global i
i+=1
print('test1:', i, args)
if i<3:
return True # keep running
else:
return False # end timer
# call test1 every 1000ms, until it return False
GLib.timeout_add(1000, test1, 'foo', 123)
loop = GLib.MainLoop() # just for test without UI
loop.run()
输出结果:
$ python3 ../test_gtk_timeout.py
test1: 1 ('foo', 123)
test1: 2 ('foo', 123)
test1: 3 ('foo', 123)
1
如果你在使用新的 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>
17
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()