定期调用 pygtk 主循环中的函数

发布于 2024-12-03 04:20:59 字数 84 浏览 0 评论 0 原文

tkinter 中 after 方法的 pygtk 等效项是什么?

我想定期调用主循环中的函数。

实现它的更好方法是什么?

What's the pygtk equivalent for after method in tkinter?

I want to periodically call a function in the main loop.

What is the better way to achieve it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

一绘本一梦想 2024-12-10 04:20:59

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

Use gobject.timeout_add:

import gobject
gobject.timeout_add(milliseconds, callback)

For example here is a progress bar that uses timeout_add to update the progress (HScale) value:

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()
屌丝范 2024-12-10 04:20:59

如果您使用新的 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>

If you're using the new Python GObject Introspection API, you should use GLib.timeout_add().

Note that the documentation seems to be incorrect. It is actually:

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

Here's an example. Note that run is a callable object, but it could be any ordinary function or method.

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

Output:

$ 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>
我也只是我 2024-12-10 04:20:59

或者最简单的测试代码
// 基于 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)

or the simplest test code
// base on Jonathon Reinhart's answer

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

outputs:

$ python3 ../test_gtk_timeout.py
test1: 1 ('foo', 123)
test1: 2 ('foo', 123)
test1: 3 ('foo', 123)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文