【问题标题】:interactive console for my mainloop app我的 mainloop 应用程序的交互式控制台
【发布时间】:2010-06-30 10:19:02
【问题描述】:

我有一个小脚本记录登录到我的 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() 中使用某种回调?

【问题讨论】:

    标签: python interactive dbus


    【解决方案1】:

    您应该看一下通用 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。

    【讨论】:

      猜你喜欢
      • 2012-04-08
      • 2016-04-30
      • 1970-01-01
      • 2013-07-28
      • 2020-07-01
      • 2020-10-15
      • 2013-10-20
      • 2011-11-24
      • 2016-06-23
      相关资源
      最近更新 更多