使用PyQt使用DBus进行编程

我正在尝试编写支持全局菜单的桌面环境在开始使用我的主要任务之前在PyQt中,我试图让dbus代码与QtDBus作为概念certificate。 这是我从d-feet获得的漂亮打印输出和方法签名:

 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')] 

这是我在PyQt中编写的代码,期待类似的东西:

 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_() 

这是我从上面的代码得到的输出:

 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": [] 

谁能告诉我为什么没有发送消息?

根据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. 

这表明问题,即您的service_path 。 所有DBus路径都以/开头,因此您应该更改

 service_path = 'com/canonical/AppMenu/Registrar' 

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