2010-06-30 67 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。