You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:35:29