Вы должны смотреть в направлении общего программирования GObject / GLib (отсюда и gobject.MainLoop()
).Вы можете использовать потоки, вы можете использовать обратные вызовы событий, что угодно.Например, это простая «консоль», использующая обратные вызовы событий.Добавьте это непосредственно перед loop.run()
:
import glib, sys, os, fcntl
class IODriver(object):
def __init__(self, line_callback):
self.buffer = ''
self.line_callback = line_callback
flags = fcntl.fcntl(sys.stdin.fileno(), fcntl.F_GETFL)
flags |= os.O_NONBLOCK
fcntl.fcntl(sys.stdin.fileno(), fcntl.F_SETFL, flags)
glib.io_add_watch(sys.stdin, glib.IO_IN, self.io_callback)
def io_callback(self, fd, condition):
chunk = fd.read()
for char in chunk:
self.buffer += char
if char == '\n':
self.line_callback(self.buffer)
self.buffer = ''
return True
def line_entered(line):
print "You have typed:", line.strip()
d = IODriver(line_entered)
Если вы создаете приложение PyGTK, вам не нужно вызывать mainloop специально для dbus, потому что он будет использовать mainloop основного приложения.Также доступны другие mainloops для других библиотек, например dbus.mainloop.qt для PyQt4.