web-dev-qa-db-fra.com

Programmer avec DBus en utilisant PyQt

J'essaie d'écrire un environnement de bureau prenant en charge le menu global Avant de commencer ma tâche principale dans PyQt, j'essaie de faire en sorte que le code dbus fonctionne avec QtDBus comme preuve de concept. Voici la sortie joliment imprimée et la signature de méthode que j'ai obtenues de d-pieds:

GetMenus() -> (Array of [Struct of (Uint32,String,Object Path)] menus)

[(60817412L, u':1.155', '/com/canonical/menu/3A00004'),
 (58725289L, u':1.151', '/com/canonical/menu/38013A9'),
 (58720393L, u':1.151', '/com/canonical/menu/3800089'),
 (62916305L, u':1.159', '/com/canonical/menu/3C006D1'),
 (54526127L, u':1.129', '/com/canonical/menu/34000AF'),
 (58725701L, u':1.151', '/com/canonical/menu/3801545'),
 (25167093L, u':1.22', '/com/canonical/menu/18004F5'),
 (58726237L, u':1.151', '/com/canonical/menu/380175D'),
 (60825279L, u':1.155', '/com/canonical/menu/3A01EBF'),
 (58721371L, u':1.151', '/com/canonical/menu/380045B'),
 (25165828L, u':1.22', '/com/canonical/menu/1800004')]

C'est le code que j'ai écrit dans PyQt et qui attend quelque chose de similaire:

from PyQt4.QtGui import QApplication
from PyQt4.QtDBus import QDBus
from PyQt4.QtDBus import QDBusConnection
from PyQt4.QtDBus import QDBusInterface

desktop = QApplication([])
session_bus_connection = QDBusConnection.sessionBus()
service_name = 'com.canonical.AppMenu.Registrar'
service_path = 'com/canonical/AppMenu/Registrar'
interface = 'com.canonical.AppMenu.Registrar'
menu = QDBusInterface(service_name, service_path, interface, QDBusConnection.sessionBus())
reply = menu.call('GetMenus')
print reply.arguments()
desktop.exec_()

Voici le résultat du code ci-dessus:

christopher@xx-pc:~/Documents/Code$ python desktop_dbus.py
process 2613: arguments to dbus_message_new_method_call() were incorrect, assertion "_dbus_check_is_valid_path (path)" failed in file ../../dbus/dbus-message.c line 1204.
This is normally a bug in some application using the D-Bus library.
process 2613: arguments to dbus_message_set_auto_start() were incorrect, assertion "message != NULL" failed in file ../../dbus/dbus-message.c line 2885.
This is normally a bug in some application using the D-Bus library.
process 2613: arguments to dbus_message_iter_init_append() were incorrect, assertion "message != NULL" failed in file ../../dbus/dbus-message.c line 2284.
This is normally a bug in some application using the D-Bus library.
QDBusConnection: error: could not send message to service "com.canonical.AppMenu.Registrar" path "com/canonical/AppMenu/Registrar" interface "org.freedesktop.DBus.Introspectable" member "Introspect": 
[]

Quelqu'un peut-il me dire pourquoi le message n'est pas envoyé?

4
Christopher

Réponse basée sur ce commentaire par Jjed :

process 2613: arguments to dbus_message_new_method_call() were incorrect
 assertion "_dbus_check_is_valid_path (path)" failed in file ../../dbus/dbus-message.c line 1204.
This is normally a bug in some application using the D-Bus library.

Cela indique le problème, qui est votre service_path. Tous les chemins DBus commencent par /, vous devez donc changer

service_path = 'com/canonical/AppMenu/Registrar'

à

service_path = '/com/canonical/AppMenu/Registrar'
2
Zanna