web-dev-qa-db-ja.com

よく知られていない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を理解するために、次の2つの記事を使用しています: dbus-pythonチュートリアル および dbus-monitor出力の読み方

ただし、コードのバス名、パス、インターフェイス、信号に使用する値については少し混乱しています。正しい値を算出するためにqdbusをいじくり回しましたが、探しているものが見つからないようです。 get_objectには「よく知られた」名前が必要なので、私は捨てられたと思いますが、私が持っているのは、送信者destの一意の数値識別子だけです。

正しい方向へのナッジは大歓迎です。

3
jwigley

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」インターフェイスを詳しく調べたところ、実際にはメソッドであり、信号ではないことに気付きました。その後、反応する別の信号を選択しました。

1
jwigley