интерактивная консоль для моего приложения mainloop - PullRequest
0 голосов
/ 30 июня 2010

У меня есть небольшой скрипт, который регистрирует пользователей, которые входят в мою учетную запись 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()?

1 Ответ

3 голосов
/ 16 июля 2010

Вы должны смотреть в направлении общего программирования 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.

...