Я пытаюсь использовать dbus для реакции на конкретный сигнал (пользователь нажимает на appindicator меню на верхней панели единицы). От использования dbus-монитора я нашел соответствующий сигнал, что я хотел бы реагировать на:
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-монитора?
Однако я немного смущен, относительно каких значений я должен использовать для названия шины, пути, интерфейса и сигнала в моем коде. Я попытался ввести по абсолютному адресу вокруг в qdbus для разработки правильных значений, но я, может казаться, не нахожу то, что я ищу. Я думаю, что был отброшен, потому что get_object требует "известного" имени, но все, что я имею, является числовыми уникальными идентификаторами для отправителя, dest.
Любое пошаговое перемещение в правильном направлении значительно ценилось бы.
Функцию add_signal_receiver можно использовать без указания имени шины. Это может быть полезно для захвата сигналов, когда имя шины, интерфейс или конкретное имя сигнала неизвестны.
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 я понял, что на самом деле это метод, а не сигнал. С тех пор я выбрал другой сигнал для реагирования.