【问题标题】:Using dbus in python without using a shell command在python中使用dbus而不使用shell命令
【发布时间】:2021-12-31 17:15:13
【问题描述】:

这就是我所做的,因为我不知道如何使用 dbus 库 该脚本会轮询我的鼠标的 DPI 何时被鼠标上的按钮更改并将其设置为可用的值,然后将当前 DPI 打印到 KDE widget 但我正在使用子进程库,因为我不知道如何使用dbus 库

#!/usr/bin/env python3
from openrazer.client import DeviceManager
from time import sleep
from subprocess import run as call
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
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=str(dpi[0])+','+str(dpi[1])
    if not l_out == out:
        call(['qdbus','org.kde.plasma.doityourselfbar',ID,'org.kde.plasma.doityourselfbar.pass','|A|<img src="/usr/local/share/icons/diybar/mouse.svg" height="22"/>'+out+' DPI|'+dev.name+'||'])
    l_out=out
    sleep(0.7)

shell 命令示例

qdbus org.kde.plasma.doityourselfbar /id_10 org.kde.plasma.doityourselfbar.pass '|A|<img src="/usr/local/share/icons/diybar/mouse.svg" height="22"/>900 DPI|Razer DeathAdder Elite||'

我已经看过documentation for dbus,但我已经放弃尝试弄清楚了

【问题讨论】:

    标签: python dbus


    【解决方案1】:

    正如您链接到的 dbus 文档顶部所说:

    dbus-python 可能不是最适合您使用的 D-Bus 绑定。

    使用像pydbus这样更现代的库可能会更好

    我没有要测试的设置,但我对如何转换命令的最佳猜测:

    qdbus org.kde.plasma.doityourselfbar /id_10 org.kde.plasma.doityourselfbar.pass '|A|<img src="/usr/local/share/icons/diybar/mouse.svg" height="22"/>900 DPI|Razer DeathAdder Elite||'
    

    使用 pydbus 将是

    from pydbus import SessionBus
    
    bus = SessionBus()
    bar = bus.get('org.kde.plasma.doityourselfbar', '/id_10')
    
    bar.pass('|A|<img src="/usr/local/share/icons/diybar/mouse.svg" height="22"/>900 DPI|Razer DeathAdder Elite||')
    
    

    【讨论】:

    • bar.pass 中 p 的语法错误 - pastebin.com/WNrQrMz0
    • 如果你这样做print(dir(bar))会得到什么输出?
    • 一个错误告诉我没有安装 pydbus,一个不附带 python2 的发行版如何没有为 python3 安装现代 python dbus 库,修复后我得到这个:pastebin.com/QGs6paGD 注意: 安装 pydbus 并不能修复语法错误
    • 我不明白您为什么会遇到语法错误,因为 pass 在可用于 bar 的函数列表中
    • 问题是 100% 的属性名称是 pass 我编辑了小程序并制作了一个 pysafepass,它是 pass 的副本,使用 bar.pysafepass('string') 确实有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2013-01-31
    • 2016-01-12
    • 1970-01-01
    • 2015-04-04
    相关资源
    最近更新 更多