PyQt5:如何使用 QtDBus get/set 属性

PyQt5: How to get/set properties using QtDBus

我正在尝试使用其 D-Bus 接口“org.mpris.MediaPlayer2”与 SMPlayer 进行通信。调用方法工作正常。例如:

smp = QDBusInterface(r'org.mpris.MediaPlayer2.smplayer', "/org/mpris/MediaPlayer2", "org.mpris.MediaPlayer2.Player")
smp.call("Pause")
smp.call("Seek",QDBusArgument(int(value_in_ms)*1000, QMetaType.LongLong))

我尝试了下面这两个我在网上找到的变体,但第一个变体的结果是 None(我认为应该这样做),我得到错误 No such method 'Rate' in interface 'org.mpris.MediaPlayer2.Player' at object path '/org/mpris/MediaPlayer2'(signature '')第二个:

res = smp.property("Rate")
res = smp.call("Rate")

我验证了这些属性确实存在。我可以在命令行上使用 dbus-send 或 qdbus 读取它们。知道我做错了什么吗?

您的代码有几个问题。您对 get/set 属性使用了错误的接口,并且参数类型指定不正确。此外,您正在尝试使用 property(),这是一种与 dbus 无关的继承 QObject 方法。

下面的交互式演示脚本显示了如何获取和设置SMPLayer Rate 属性(其格式为documented here). Note that it is essential that QDBusVariant用于在设置属性时指定值:

from PyQt5 import QtDBus

service = 'org.mpris.MediaPlayer2.smplayer'
path = '/org/mpris/MediaPlayer2'
iface = 'org.mpris.MediaPlayer2.Player'
props = 'org.freedesktop.DBus.Properties'

smp = QtDBus.QDBusInterface(service, path, props)
msg = smp.call('Get', iface, 'Rate')
print(f'Current Rate: {msg.arguments()[0]}\n')

rate = input('Enter New Rate: ')

try:
    rate = float(rate)
except ValueError:
    print(f'ERROR: invalid rate value: {rate!r}')
else:
    msg = smp.call('Set', iface, 'Rate', QtDBus.QDBusVariant(rate))
    if msg.errorName():
        print('ERROR:', msg.errorMessage())
    else:
        msg = smp.call('Get', iface, 'Rate')
        print(f'Set New Rate: {msg.arguments()[0]}')

输出:

$ python demo.py
Current Rate: 1.0

Enter New Rate: 1.25
Set New Rate: 1.25