如何用Python的dasbus读取Ubuntu夜灯属性并订阅D-Bus信号
用Python结合dasbus监控Ubuntu夜灯状态
实现步骤
1. 读取夜灯属性
通过dasbus的ObjectProxy可以直接访问目标接口的属性,无需手动调用PropertyProxy.get(),直接通过属性名即可获取NightLightActive(夜灯是否激活)和Temperature(当前色温值)。
2. 订阅属性变更信号
D-Bus标准的org.freedesktop.DBus.Properties接口会在属性变化时发出PropertiesChanged信号,我们可以通过SessionMessageBus.subscribe()方法订阅该信号,并注册回调函数处理变化。
完整代码
#!/usr/bin/env python3 from dasbus.connection import SessionMessageBus def on_properties_changed(interface_name, changed_props, invalidated_props): """处理属性变更的回调函数""" if interface_name == "org.gnome.SettingsDaemon.Color": # 检查夜灯激活状态是否变化 if "NightLightActive" in changed_props: print(f"夜灯状态变更: {'已开启' if changed_props['NightLightActive'] else '已关闭'}") # 检查色温是否变化 if "Temperature" in changed_props: print(f"色温值变更: {changed_props['Temperature']}") def main(): # 连接到会话总线 bus = SessionMessageBus() # 获取Color服务的代理对象 color_proxy = bus.get_proxy( "org.gnome.SettingsDaemon.Color", "/org/gnome/SettingsDaemon/Color" ) # 读取并打印当前夜灯属性 print("当前夜灯状态:", "已开启" if color_proxy.NightLightActive else "已关闭") print("当前色温值:", color_proxy.Temperature) # 订阅PropertiesChanged信号 bus.subscribe( signal_name="PropertiesChanged", interface_name="org.freedesktop.DBus.Properties", object_path="/org/gnome/SettingsDaemon/Color", callback=on_properties_changed ) # 保持程序运行以监听信号 print("开始监听夜灯状态变化...") bus.run() if __name__ == "__main__": main()
代码说明
- 属性读取:
color_proxy.NightLightActive和color_proxy.Temperature直接映射到D-Bus接口的对应属性,dasbus会自动处理类型转换。 - 信号订阅:
bus.subscribe()指定了信号名、接口名和对象路径,当目标属性变化时,on_properties_changed回调会被触发,我们可以在回调中过滤目标接口的属性变化并输出。 - 保持运行:
bus.run()启动事件循环,让程序持续监听D-Bus信号。
内容的提问来源于stack exchange,提问作者handle
相关产品推荐
相关产品推荐

