2010-11-08 4 views
11

J'ai un problème avec python et dbus. J'ai vérifié les documents et les spécifications du développeur, mais je ne comprends pas comment configurer une boucle principale. Je veux écouter les événements de notification. VoirPython et d-bus: comment configurer la boucle principale?

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

et

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

Mon exemple de script:

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 n'a pas d'autres méthodes comme run(). Si j'utilise une boucle de gobject et changer le code source:

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

Je reçois le message suivant d'erreur:

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 

Toute idée de quoi faire à ce sujet? Merci d'avance. phineas

Répondre

7

Mettez import gobject en haut de votre code, et après avoir instancié votre objet, faites gobject.MainLoop().run(). Je pense que le MainLoop doit être créé après la création du DBusGMainLoop.

+2

merci beaucoup, ça marche maintenant. La construction d'une boucle principale n'est pas très évidente, n'est-ce pas? – phineas