GTK主要块 - Python

时间:2012-10-17 05:49:13

标签: python gtk event-loop

我是GTK的新手,我偶然发现了一个听起来简单的问题,但我无法找到解决问题的方法。基本上,调用gtk.main()会使我的单线程进程停止。我知道gtk.main()正在阻塞,但我没有在任何时候调用gtk.main()因此退出主循环将没有任何好处,因为没有循环退出。

即便如此,gtk.main_level()返回0.此外,当我从python命令行尝试gtk.main()时,它也会挂起。我缺少一些基本的东西,有人能指出这个吗?赞赏。

编辑: 我需要的Gtk方法是gobject.add_timeout,如下所示:

gobject.timeout_add(2000, callback)
gtk.main() # This blocks the thread.

2 个答案:

答案 0 :(得分:8)

看起来它正在阻止应用程序,但正在做的是处理事件。其中一个事件必须终止循环。您可以查看event loops in Wikipedia背后的想法。

如果您不想编程图形界面,那么您不需要Gtk,只需要Glib。这里有一个示例向您展示主循环的工作原理(概念在Gtk和Glib中类似):

from gi.repository import GLib, GObject

counter = 0

def callback(*args):
    global counter
    counter += 1
    print 'callback called', counter
    if counter > 10:
        print 'last call'
        return False

    return True

def terminate(*args):
    print 'Bye bye'
    loop.quit()

GObject.timeout_add(100, callback)
GObject.timeout_add(3000, terminate)
loop = GLib.MainLoop()
loop.run()

如果回调返回False,那么它将被删除而不再被调用。如果您希望再次调用回调,则必须返回True(正如您在函数callback中看到的那样)。

我设置了另一个回调terminate以显示如何退出循环。如果你没有明确地做,那么GLib将继续等待更多的事件(它没有任何方法可以知道你想做什么)。

使用PyGTK(旧的和弃用的),代码将是:

import gobject, glib, gtk

counter = 0

def callback(*args):
    global counter
    counter += 1
    print 'callback called', counter
    if counter > 10:
        print 'last call'
        return False

    return True

def terminate(*args):
    print 'Bye bye'
    loop.quit()

gobject.timeout_add(100, callback)
gobject.timeout_add(3000, terminate)
loop = glib.MainLoop()
loop.run()

答案 1 :(得分:0)

我遇到了同样的问题,然后在调用gtk.gdk.threads_init()之前添加了此gtk.mainloop()。它适用于我