Как реализовать ползунок, контролирующий момент воспроизведения mp3-файла?(PyQt 5, Python 3)
Я видел некоторые примеры, где создавали QSlider, который был привязан к QMediaPlayer. Но эти примеры были осложнены различными дополнительными функциями, из-за чего мне было очень тяжело понять устройство самого ползунка.
Я бы хотел создать простой ползунок, который мог бы контролировать момент воспроизведения аудиофайла. Пожалуйста, подскажите, как его можно сделать?
Сейчас мой код может только воспроизводить и ставить на паузу файлы, пути к которым хранит словарь self.dict:
from PySide2 import QtCore, QtWidgets, QtGui, QtMultimedia
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.dict = {
'1.Papercut.mp3': [],
'13.Numb.mp3': []
}
self.song = ''
self.player = QtMultimedia.QMediaPlayer()
self.qsl = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
self.qsl.sliderMoved[int].connect(self.SetPlayPosition)
self.box = QtWidgets.QGridLayout(self)
for line, song in enumerate(self.dict):
play_btn = QtWidgets.QPushButton('Play', clicked=lambda song=song: self.play(song))
pause_btn = QtWidgets.QPushButton('Pause', clicked=self.pause, enabled=False)
label = QtWidgets.QLabel(song)
self.box.addWidget(play_btn, line, 0)
self.box.addWidget(pause_btn, line, 1)
self.box.addWidget(label, line, 2)
self.dict[song].append(play_btn)
self.dict[song].append(pause_btn)
self.box.addWidget(self.qsl, 2, 0)
def SetPlayPosition(self):
self.player.setPosition(self.qsl.value())
# Воспроизведение
def play(self, song):
if self.player.isAudioAvailable() == False:
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
self.dict[song][1].setEnabled(True)
self.song = song
if self.song == song:
pass
else:
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
self.dict[self.song][1].setEnabled(False)
self.dict[song][1].setEnabled(True)
self.song = song
self.player.play()
# Пауза
def pause(self):
self.player.pause()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle('MP3-player, PyQt5')
window.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
В общем, все подробности здесь https://doc.qt.io/qt-5/qmediaplayer.html
и здесь https://doc.qt.io/qt-5/qslider.html
Я отметил для вас строки, в которые внесены изменения.
#from PySide2 import QtCore, QtWidgets, QtGui, QtMultimedia
from PyQt5 import QtCore, QtWidgets, QtGui, QtMultimedia
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.dict = {
'bibi.mp3': [],
'D:/_Qt/EXE/Mp3/new_build/QThread_mp3/img/zvuki_prirody.mp3': []
}
self.song = ''
self.player = QtMultimedia.QMediaPlayer()
# [signal]void QMediaPlayer::stateChanged(QMediaPlayer::State state) # +++
self.player.stateChanged.connect(self.playerState) # +++ !!!
self.qsl = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
self.qsl.sliderMoved[int].connect(self.SetPlayPosition)
self.qsl.sliderReleased.connect(self.slider_released) # +++ !!!
self.box = QtWidgets.QGridLayout(self)
for line, song in enumerate(self.dict): # !!! vv # vvvv
play_btn = QtWidgets.QPushButton('Play', clicked=lambda ch, song=song: self.play(song)) # + ch, !!!
pause_btn = QtWidgets.QPushButton('Pause', clicked=self.pause, enabled=False)
label = QtWidgets.QLabel(song)
self.box.addWidget(play_btn, line, 0)
self.box.addWidget(pause_btn, line, 1)
self.box.addWidget(label, line, 2)
self.dict[song].append(play_btn)
self.dict[song].append(pause_btn)
self.box.addWidget(self.qsl, 2, 0, 1, 3) # + , 1, 3
# ++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
self.Play_Pause = True
self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.PlayMode)
self.timer.start(1000)
def PlayMode(self):
if self.Play_Pause==False:
self.qsl.setMinimum(0)
self.qsl.setMaximum(self.player.duration())
self.qsl.setValue(self.qsl.value() + 1000)
def slider_released(self):
# print(f'slider_released ->> {self.qsl.value()}') # !!!
self.player.setPosition(self.qsl.value()) # !!!
# ++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
def SetPlayPosition(self, val):
pass
#? self.player.setPosition(self.qsl.value()) # см. выше
# print(val) # !!!
# Воспроизведение
def play(self, song):
if self.player.isAudioAvailable() == False:
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
self.dict[song][1].setEnabled(True)
self.song = song
if self.song == song:
pass
else:
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
self.dict[self.song][1].setEnabled(False)
self.dict[song][1].setEnabled(True)
self.song = song
self.player.play()
self.Play_Pause=False # +++
# Пауза
def pause(self):
self.player.pause()
self.Play_Pause=True # +++
# ++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
def playerState(self, state):
if state == 0:
# self.qsl.setValue(0)
self.Play_Pause=True
self.qsl.setSliderPosition(0)
# ++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle('MP3-player, PyQt5')
window.show()
sys.exit(app.exec_())
