0

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.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()か?

4

1 に答える 1

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 など、他のライブラリのメインループも利用できます。

于 2010-07-15T20:39:45.230 に答える