2010-11-08 8 views
11

Ich habe ein Problem mit Python und dbus. Ich habe die Entwicklerdokumente und Spezifikationen überprüft, aber ich verstehe nicht, wie man eine Hauptschleife einrichtet. Ich möchte auf Benachrichtigungsereignisse warten. SiehePython und d-bus: Wie richte ich die Hauptschleife ein?

http://dbus.freedesktop.org/doc/dbus-python/doc/

und

http://www.galago-project.org/specs/notification/0.9/index.html

Mein Beispielskript:

import dbus 
from dbus.mainloop.glib import DBusGMainLoop 

class MessageListener: 

    def __init__(self): 

     DBusGMainLoop(set_as_default=True) 

     self.bus = dbus.SessionBus() 
     self.proxy = self.bus.get_object('org.freedesktop.Notifications', 
      '/org/freedesktop/Notifications') 

     self.proxy.connect_to_signal('NotificationClosed', 
      self.handle_notification) 

    def handle_notification(self, *args, **kwargs): 
     print args, kwargs 


if __name__ == '__main__': 
    MessageListener() 

DBusGMainLoop hat keine weiteren Methoden wie run(). Wenn ich eine Schleife von gobject verwenden und den Sourcecode ändern:

import gobject 
loop = gobject.MainLoop() 
dbus.set_default_main_loop(loop) 
... 
loop.run() 

ich folgende Fehlermeldung:

Traceback (most recent call last): 
    File "dbus_example.py", line 40, in <module> 
    MessageListener() 
    File "dbus_example.py", line 9, in __init__ 
    dbus.set_default_main_loop(loop) 
TypeError: A dbus.mainloop.NativeMainLoop instance is required 

Jede Idee, was es zu tun? Vielen Dank im Voraus. phineas

Antwort

7

Setzen Sie import gobject an der Spitze Ihres Codes, und nach der Instanziierung Ihres Objekts, tun Sie gobject.MainLoop().run(). Ich denke, dass die MainLoop erstellt werden muss, nachdem die DBusGMainLoop erstellt wurde.

+2

vielen dank, es funktioniert jetzt. Der Aufbau einer Hauptschleife ist nicht sehr offensichtlich, oder? – phineas