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