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

Python中不调用shell命令使用dbus实现KDE组件鼠标DPI显示功能

实现方案

首先确认已安装python3的dbus绑定,Debian/Ubuntu系可执行以下命令安装:

sudo apt install python3-dbus

修改后的完整代码如下:

#!/usr/bin/env python3
from openrazer.client import DeviceManager
from time import sleep
import dbus
from sys import argv

if len(argv) == 1:
    print("No DIY bar ID given!")
    quit()

ID = '/id_' + argv[1]
dev = DeviceManager().devices[0]
l_out = 0

# 初始化DBus会话总线与调用接口
session_bus = dbus.SessionBus()
doityourselfbar_obj = session_bus.get_object(
    'org.kde.plasma.doityourselfbar',
    ID
)
update_widget = doityourselfbar_obj.get_dbus_method(
    'pass',
    'org.kde.plasma.doityourselfbar'
)

while True:
    if not dev:
        sleep(3)
        if DeviceManager().devices[0]:
            dev = DeviceManager().devices[0]
        continue
    dpi = dev.dpi
    if dpi[0] == dpi[1]:
        if dpi[0] == 1800:
            dev.dpi = (900, 900)
        elif dpi[0] == 4500:
            dev.dpi = (1000, 1000)
        elif dpi[0] == 9000:
            dev.dpi = (1100, 1100)
        elif dpi[0] == 16000:
            dev.dpi = (1200, 1200)
        out = str(dev.dpi[0])
    else:
        out = f"{dpi[0]},{dpi[1]}"
    if l_out != out:
        msg = f'|A|<img src="/usr/local/share/icons/diybar/mouse.svg" height="22"/>{out} DPI|{dev.name}||'
        try:
            update_widget(msg)
        except dbus.DBusException:
            # 可按需添加错误日志、重连逻辑
            pass
    l_out = out
    sleep(0.7)

核心修改说明:

  • 直接通过DBus会话总线调用KDE组件的更新方法,完全替代了subprocess调用shell命令的逻辑,减少了不必要的进程开销
  • DBus调用参数和原qdbus命令完全对应,功能和原实现完全一致
  • 增加了基础的异常捕获逻辑,避免DBus调用临时出错导致脚本直接终止

内容的提问来源于stack exchange,提问作者GM-Script-Writer-62850

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:24:03