Ползунок контроля момента проигрывания аудиофайла работает не так, как я планировал.(PyQt 5, Python 3)
В моем коде есть словарь self.dict. Он хранит пути к аудиофайлам.
Для каждого аудиофайла создаются кнопки play_btn и pause_btn, название которых говорит само за себя.
self.qsl - это ползунок, который контролирует момент воспроизведения файла.
Сейчас он работает с ошибкой, и я хотел бы это поправить. После завершения проигрывания файла ползунок возвращается в первоначальное положение и начинает двигаться вперед, даже если файл больше не воспроизводится. Пожалуйста, подскажите, где ошибка?
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()
self.player.stateChanged.connect(self.player_state)
self.qsl = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
self.qsl.sliderMoved[int].connect(self.set_play_position)
self.qsl.sliderReleased.connect(self.slider_released)
self.qsl.setEnabled(False)
self.box = QtWidgets.QGridLayout(self)
for line, song in enumerate(self.dict):
play_btn = QtWidgets.QPushButton('Play', clicked = lambda ch, 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.play_repeat = False
self.repeat_btn = QtWidgets.QPushButton('Repeat', clicked = self.repeat)
self.box.addWidget(self.qsl, 2, 0, 1, 3)
self.box.addWidget(self.repeat_btn, 3, 0, 1, 3)
self.play_pause = True
self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.play_mode)
self.timer.start(1000)
def play_mode(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):
self.player.setPosition(self.qsl.value())
def set_play_position(self, val):
pass
# 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
self.qsl.setEnabled(True)
def pause(self):
self.player.pause()
self.play_pause = True
def player_state(self, state):
if state == 0:
self.Play_Pause = True
self.qsl.setSliderPosition(0)
self.qsl.setEnabled(False)
if self.play_repeat == True:
self.Play_Pause = False
self.play(self.song)
def repeat(self):
if self.play_repeat == False:
self.play_repeat = True
else:
self.play_repeat = False
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
→ Ссылка
Такие ошибки очень тяжело искать !
- в методе
player_stateвыself.Play_Pauseнаписали с заглавной буквы, вместоself.play_pause - в этом же методе вместо
self.play(self.song)- надоself.player.play() - в методе
__init__-self.play_repeat = True
Пробуйте
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()
self.player.stateChanged.connect(self.player_state)
self.qsl = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
self.qsl.sliderMoved[int].connect(self.set_play_position)
self.qsl.sliderReleased.connect(self.slider_released)
self.qsl.setEnabled(False)
self.box = QtWidgets.QGridLayout(self)
for line, song in enumerate(self.dict):
play_btn = QtWidgets.QPushButton('Play', clicked = lambda ch, 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.play_repeat = True # - False / + True
self.repeat_btn = QtWidgets.QPushButton('Repeat', clicked=self.repeat)
self.box.addWidget(self.qsl, 2, 0, 1, 3)
self.box.addWidget(self.repeat_btn, 3, 0, 1, 3)
self.play_pause = True
self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.play_mode)
self.timer.start(1000)
def play_mode(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):
self.player.setPosition(self.qsl.value())
def set_play_position(self, val):
pass
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
self.qsl.setEnabled(True)
def pause(self):
self.player.pause()
self.play_pause = True
def player_state(self, state):
if state == 0:
self.play_pause = True # -Play_Pause / + play_pause
self.qsl.setSliderPosition(0)
self.qsl.setEnabled(False)
if self.play_repeat == True:
self.play_pause = False # -Play_Pause / + play_pause
### self.play(self.song) # ---
self.player.play() # +++
def repeat(self):
if self.play_repeat == False:
self.play_repeat = True
self.repeat_btn.setText("Repeat") # +++
else:
self.play_repeat = False
self.repeat_btn.setText("Not Repeat") # +++
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle('MP3-player, PyQt5')
window.show()
sys.exit(app.exec_())