アプリケーションをブロックしているように見えますが、実行しているのはイベントの処理です。イベントの1つは、ループを終了する必要があります。ウィキペディアでイベントループの背後にある考え方を確認できます。
グラフィカルインターフェイスをプログラムしたくない場合は、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()