【问题标题】:Python DBUS - `PropertiesChanged` listener on interface with extra argumentsPython DBUS - 带有额外参数的接口上的“PropertiesChanged”侦听器
【发布时间】: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...

【问题讨论】:

    标签: python linux python-3.x signals dbus


    【解决方案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 吗?
    • 这可能是一个解决方案,我会试试看:)
    猜你喜欢
    • 2011-10-10
    • 1970-01-01
    • 2017-06-04
    • 2020-05-27
    • 1970-01-01
    • 2012-12-05
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多