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
我正在尝试使用其 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