如何获取不为人所知的 DBus 对象的代理?

如何获取不为人所知的 DBus 对象的代理?

我正在尝试使用 dbus 对特定信号做出反应(用户单击 Unity 顶部面板上的 appindicator 菜单)。通过使用 dbus-monitor,我找到了我想要做出反应的相关信号:

sender=:1.96 -> dest=:1.232 serial=2091 path=/org/ayatana/NotificationItem/myapp/Menu; interface=com.canonical.dbusmenu; member=AboutToShowGroup
array [
   int32 9
]

然后我的计划是用python执行以下操作:

dbus_proxy = bus.get_object ("BUS.NAME", "PATH")
interface = dbus.Interface (proxy, "INTERFACE")
interface.connect_to_signal ("SIGNAL", my_function)

def my_function:
    # react 

为了理解 dbus,我一直在使用以下两篇文章: dbus-python 教程如何读取 dbus-monitor 输出?

但是,我有点困惑,不知道在我的代码中应该使用什么值作为总线名称、路径、接口和信号。我尝试在 qdbus 中四处寻找,以找出正确的值,但似乎找不到我想要的值。我想我被搞晕了,因为 get_object 需要一个“众所周知”的名称,但我得到的只是发送方、目标的数字唯一标识符。

任何朝正确方向的推动都将不胜感激。

答案1

添加信号接收器函数可以在不指定总线名称的情况下使用。当总线名称、接口或特定信号名称未知时,这对于捕获信号非常有用。

session_bus = dbus.SessionBus()

session_bus.add_signal_receiver(self.do_something,
                                signal_name=None,
                                dbus_interface=None,
                                bus_name=None, 
                                path=None)

每次在会话总线上接收到信号时,上述代码都会调用 do_something 方法。

在我最初的问题中,我表示我想回应“AboutToShowGroup”。然而,在仔细检查了“com.canonical.dbusmenu”接口后,我意识到它实际上是一种方法,而不是一个信号。从那时起,我选择了另一个信号来做出反应。

相关内容