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
相关产品推荐
相关产品推荐

