Python DBUS - 带有额外参数的接口上的“PropertiesChanged”侦听器

Posted

技术标签:

【中文标题】Python DBUS - 带有额外参数的接口上的“PropertiesChanged”侦听器【英文标题】:Python DBUS - `PropertiesChanged` listener on interface with extra arguments 【发布时间】:2016-08-30 05:49:00 【问题描述】:

使用 Python 3 DBUS 模块,信号处理程序为 PropertiesChanged 信号采用的默认参数如下:

def handler(interface, changed_properties, invalidated_properties): something...

监听器设置如下:

dbus.Interface.connect_to_signal("PropertiesChanged", handler)

我怎样才能在最后添加一个额外的参数,以便我可以拥有一个具有如下结构的信号处理程序:

def handler(interface, changed_properties, invalidated_properties, extra_argument): something...

【问题讨论】:

【参考方案1】:

PropertiesChanged 是 org.freedesktop.DBus.Properties 接口的一部分,您不应修改其签名。其他程序假定它完全按照 DBus 规范中的规定实现。多个 DBus 绑定使用它来在代理对象发生更改时自动更新它们的属性。

您可以使用自己的自定义参数创建自己的信号:

使用 python-dbus(已弃用):

class Example(object):
    @dbus.service.signal(dbus_interface='com.example.Sample',
                        signature='us')
    def NumberOfBottlesChanged(self, number, contents):
        pass

使用 pydbus:

from pydbus.generic import signal

class Example(object):
    """
      <node>
        <interface name='com.example.Sample'>
          <signal name='NumberOfBottlesChanged'>
            <arg type='u' name='number'/>
            <arg type='s' name='contents'/>
          </signal>
        </interface>
      </node>
    """
    NumberOfBottlesChanged = signal()

【讨论】:

我正在使用 Python 3 的 freedesktop dbus 模块,我认为这与上面的第一个示例相同。我的目标最终是创建一个信号接收器,但我可以通过它传递一个类的self 对象(这样我就可以修改类的成员)——我只需要为这个程序更改它,因为它只会用过一次。 您不能简单地使用 lambda 作为处理程序,并在其词法范围内使用 self 吗? 这可能是一个解决方案,我会试试看:)

以上是关于Python DBUS - 带有额外参数的接口上的“PropertiesChanged”侦听器的主要内容,如果未能解决你的问题,请参考以下文章

带有 OUT (sbb) 参数的 Dbus 函数

从python访问iwd dbus接口

dbus_to_python() 只需要 1 个参数?

带有 MiNGW 的 Windows 上的 Python D-Bus

如何使用 python 处理 dbus 接口的属性?

Python Dbus:如何导出接口属性