2010-06-30 63 views
0

交互控制台我有一个小脚本,都会记录登录用户到我的洋泾浜/ MSN帐户我的主循环应用

#!/usr/bin/env python 

def log_names(buddy): 
    name = str(purple.PurpleBuddyGetName(buddy)) 
    account = purple.PurpleAccountGetUsername(purple.PurpleBuddyGetAccount(buddy)) 

    if account == u'[email protected]': 

     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()内使用某种回调吗?

回答

3

你应该看一般的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的应用程序,您不必特意致电主循环的DBUS,因为它会使用主应用程序的主循环。还有其他可用的库,如PyQt4的dbus.mainloop.qt。