Как получить прокси для объекта DBus, который не очень известен?

Я стараюсь использовать dbus для реагирования на определенный сигнал (пользователь нажимает на меню аппендикатора на верхней панели единства). Используя 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 требует "хорошо известного" имени, но все, что у меня есть, это числовые уникальные идентификаторы для sender, dest.

Любой толчок в правильном направлении будет принята с благодарностью.

1 ответ

Функция 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 я понял, что на самом деле это метод, а не сигнал. С тех пор я выбрал другой сигнал для реагирования.

Другие вопросы по тегам