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