0

我是 GTK 的新手,偶然发现了一个听起来很简单的问题,但我就是找不到解决方法。基本上,调用gtk.main()会使我的单线程进程停止。我知道这gtk.main()是阻塞的,但我之前没有打电话gtk.main(),所以退出主循环不会有任何好处,因为没有循环可以退出。

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

编辑:我需要的 Gtk 方法是gobject.add_timeout,像这样:

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

2 回答 2

8

看起来它正在阻塞应用程序,但正在做的是处理事件。其中一个事件必须终止循环。您可以在 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()
于 2012-10-17T07:01:21.057 回答
0

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

于 2017-08-09T04:05:25.307 回答