我正在尝试创建一个系统来通过 mpris 跟踪当前正在播放的媒体。改编自这个问题的PyQt6答案,我尝试了以下代码:
from PyQt6 import QtCore, QtWidgets, QtDBus
import sys
class MainWindow(QtWidgets.QMainWindow):
def __init__ (self):
super().__init__()
service = 'org.mpris.MediaPlayer2.vlc'
path = '/org/mpris/MediaPlayer2'
iface = 'org.mpris.MediaPlayer2'
conn = QtDBus.QDBusConnection.systemBus()
conn.registerObject('/', self)
conn.connect(service, path, iface, 'PropertiesChanged', self.nochangeslot)
@QtCore.pyqtSlot(QtDBus.QDBusMessage)
def nochangeslot(self, msg):
print(f'signature: {msg.signature()!r}, '
f'arguments: {msg.arguments()!r}')
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
这应该连接任何 VLC Media Player 实例(替换为您选择的服务或以编程方式查找它),将 PropertiesChanged 发送到打印消息的简单函数。
在执行更改当前歌曲等操作时,应发出PropertiesChanged。但是,这样做时不会打印任何内容。我也尝试将
iface
更改为'org.mrpis.MediaPlayer2.Player'
,但并没有改善问题。
知道为什么这不起作用吗?
有两个问题:
您在系统总线上找不到 MPRIS 播放器或任何其他应用程序。它们都连接到用户的个人会话总线。
由于属性是通用 D-Bus 概念,因此它们的信号和方法始终作为通用
org.freedesktop.DBus.Properties
接口的一部分实现,而不是作为对象自定义接口的一部分。
(每个属性所属的“真实”接口实际上作为这些信号和方法的参数提供。)