我正试图使用SMPlayer的D总线接口"org.mpris.MediaPlayer2“与其进行通信。调用方法很好。例如:
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读取它们。知道我做错了什么吗?
发布于 2022-06-04 19:01:19
您的代码有几个问题。您使用错误的接口获取/设置属性,参数类型被错误地指定。此外,您还试图使用property(),它是继承的QObject方法,与dbus无关。
下面的交互式演示脚本展示了如何获取和设置SMPLayer Rate属性(其格式为记录在这里)。请注意,在设置属性时,必须使用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.25https://stackoverflow.com/questions/72500055
复制相似问题