Python 我的mainloop应用程序的交互式控制台
我有一个小脚本,记录登录到我的Pidgin/MSN帐户的用户Python 我的mainloop应用程序的交互式控制台,python,interactive,dbus,Python,Interactive,Dbus,我有一个小脚本,记录登录到我的Pidgin/MSN帐户的用户 #!/usr/bin/env python def log_names(buddy): name = str(purple.PurpleBuddyGetName(buddy)) account = purple.PurpleAccountGetUsername(purple.PurpleBuddyGetAccount(buddy)) if account == u'dummy_account@hotmail
#!/usr/bin/env python
def log_names(buddy):
name = str(purple.PurpleBuddyGetName(buddy))
account = purple.PurpleAccountGetUsername(purple.PurpleBuddyGetAccount(buddy))
if account == u'dummy_account@hotmail.com':
try: log[name] += 1
except KeyError: log[name] = 1
log.sync()
import dbus, gobject, shelve
from dbus.mainloop.glib import DBusGMainLoop
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
log = shelve.open('pidgin.log')
obj = bus.get_object('im.pidgin.purple.PurpleService',
'/im/pidgin/purple/PurpleObject')
purple = dbus.Interface(obj, 'im.pidgin.purple.PurpleInterface')
bus.add_signal_receiver(log_names,
dbus_interface='im.pidgin.purple.PurpleInterface',
signal_name='BuddySignedOn')
loop = gobject.MainLoop()
loop.run()
我想在此添加一个简单的交互式控制台,它允许我从日志对象查询数据,但我一直在思考如何实现它
我是否使用某种类型的线程,或者我是否能够在
gobject.MainLoop()
中使用某种回调?您应该关注常规gobject/GLib编程的方向(这就是gobject.MainLoop()
的来源)。您可以使用线程、事件回调等等。例如,这是一个使用事件回调的简单“控制台”。将其添加到循环.run()之前:
如果您正在构建PyGTK应用程序,则不必专门为DBU调用mainloop,因为它将使用主应用程序的mainloop。其他库也有其他mainloop可用,例如PyQt4的dbus.mainloop.qt。您应该朝着通用GObject/GLib编程的方向看(这就是GObject.mainloop()
的来源)。您可以使用线程、事件回调等等。例如,这是一个使用事件回调的简单“控制台”。将其添加到循环.run()之前:
如果您正在构建PyGTK应用程序,则不必专门为DBU调用mainloop,因为它将使用主应用程序的mainloop。其他库也有其他mainloop可用,例如PyQt4的dbus.mainloop.qt
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)