我正在尝试使用 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”接口后,我意识到它实际上是一种方法,而不是一个信号。从那时起,我选择了另一个信号来做出反应。