Функция добавить/сохранить PyQt5
Возможно ли добавить функцию добавления музыкального файла в плейлист и сохранения его в плейлисте. + как добавить видимый список песен
Код плеера:
import sys, os
from PyQt5 import QtWidgets, QtCore, QtMultimedia
class AudioPlayer(QtWidgets.QWidget):
def __init__(self, parent = None):
super().__init__(parent, flags = QtCore.Qt.Window | QtCore.Qt.MSWindowsFixedSizeDialogHint)
self.setWindowTitle("Audio Player")
self.mplPlayer = QtMultimedia.QMediaPlayer()
self.mplPlayer.setVolume(50)
self.mplPlayer.mediaStatusChanged.connect(self.init_player)
self.mplPlayer.stateChanged.connect(self.set_player_state)
self.playlist = QtMultimedia.QMediaPlaylist()
files = ["Musical files here"]
for f in files:
fn = QtCore.QUrl.fromLocalFile(os.path.abspath(f))
self.playlist.addMedia(QtMultimedia.QMediaContent(fn))
fn = QtCore.QUrl.fromLocalFile(os.path.abspath(files[0]))
self.playlist.insertMedia(4, QtMultimedia.QMediaContent(fn))
self.playlist.removeMedia(0)
self.playlist.setCurrentIndex(0)
self.mplPlayer.setPlaylist(self.playlist)
button_next = QtWidgets.QPushButton("⏯")
button_previous = QtWidgets.QPushButton("⏮")
button_shuffle = QtWidgets.QPushButton("?")
h1layout = QtWidgets.QHBoxLayout()
h1layout.addWidget(button_next)
h1layout.addWidget(button_previous)
h1layout.addWidget(button_shuffle)
button_next.clicked.connect(self.playlist.next)
button_previous.clicked.connect(self.playlist.previous)
button_shuffle.clicked.connect(self.playlist.shuffle)
vlayout = QtWidgets.QVBoxLayout()
button_open = QtWidgets.QPushButton("&Open file")
button_open.clicked.connect(self.open_file)
vlayout.addWidget(button_open)
self.sldPosition = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.sldPosition.setMinimum(0)
self.sldPosition.sliderMoved[int].connect(self.setPlayPosition)
self.mplPlayer.positionChanged.connect(self.sldPosition.setValue)
self.sldPosition.setEnabled(False)
vlayout.addWidget(self.sldPosition)
hlayout = QtWidgets.QHBoxLayout()
self.button_play = QtWidgets.QPushButton(" ▶️ ")
self.button_play.setFixedSize(70, 30)
self.button_play.clicked.connect(self.mplPlayer.play)
self.button_play.setEnabled(False)
hlayout.addWidget(self.button_play)
self.button_pause = QtWidgets.QPushButton("||")
self.button_pause.setFixedSize(70, 30)
self.button_pause.clicked.connect(self.mplPlayer.pause)
self.button_pause.setEnabled(False)
hlayout.addWidget(self.button_pause)
self.button_stop = QtWidgets.QPushButton("⏹")
self.button_stop.setFixedSize(70, 30)
self.button_stop.clicked.connect(self.mplPlayer.stop)
self.button_stop.setEnabled(False)
hlayout.addWidget(self.button_stop)
hlayout.setAlignment(QtCore.Qt.AlignLeft)
vlayout.addLayout(hlayout)
vlayout.addLayout(h1layout)
hlayout = QtWidgets.QHBoxLayout()
label_volume = QtWidgets.QLabel("&Volume")
hlayout.addWidget(label_volume)
slider_volume = QtWidgets.QSlider(QtCore.Qt.Horizontal)
slider_volume.setRange(0, 100)
slider_volume.setTickPosition(QtWidgets.QSlider.TicksAbove)
slider_volume.setTickInterval(10)
slider_volume.setValue(10)
label_volume.setBuddy(slider_volume)
hlayout.addWidget(slider_volume)
button_mute = QtWidgets.QPushButton("&Mute")
button_mute.setCheckable(True)
button_mute.toggled.connect(self.mplPlayer.setMuted)
hlayout.addWidget(button_mute)
vlayout.addLayout(hlayout)
self.label_current = QtWidgets.QLabel("")
vlayout.addWidget(self.label_current)
self.playlist.currentMediaChanged.connect(self.show_File)
self.setLayout(vlayout)
self.resize(300, 100)
def show_File(self, content):
self.label_current.setText(content.canonicalUrl().fileName())
def open_file(self):
file = QtWidgets.QFileDialog.getOpenFileUrl(parent = self,
caption = "Choose musical file: ",
filter = "Musical files (*.mp3 *.ac3)")
self.mplPlayer.setMedia(QtMultimedia.QMediaContent(file[0]))
def init_player(self, state):
if state == QtMultimedia.QMediaPlayer.LoadedMedia:
self.mplPlayer.stop()
self.button_play.setEnabled(True)
self.sldPosition.setEnabled(True)
self.sldPosition.setMaximum(self.mplPlayer.duration())
elif state == QtMultimedia.QMediaPlayer.NoMedia or state == QtMultimedia.QMediaPlayer.InvalidMedia:
self.sldPosition.setValue(0)
self.sldPosition.setEnabled(False)
self.button_play.setEnabled(False)
self.button_stop.setEnabled(False)
self.button_pause.setEnabled(False)
def set_player_state(self, state):
if state == QtMultimedia.QMediaPlayer.StoppedState:
self.sldPosition.setValue(0)
self.button_pause.setEnabled(False)
self.button_stop.setEnabled(False)
elif state == QtMultimedia.QMediaPlayer.PlayingState:
self.button_pause.setEnabled(True)
self.button_stop.setEnabled(True)
elif state == QtMultimedia.QMediaPlayer.PausedState:
self.button_pause.setEnabled(False)
self.button_stop.setEnabled(True)
def setPlayPosition(self, value):
self.mplPlayer.setPosition(value)
class MainWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowFlags(QtCore.Qt.Window)
button_player = QtWidgets.QPushButton("&Audio Player")
hlayout = QtWidgets.QHBoxLayout()
hlayout.addWidget(button_player)
self.setLayout(hlayout)
button_player.clicked.connect(self.open_player)
def open_player(self):
self.window = AudioPlayer(self)
self.window.resize(400, 200)
self.window.show()
if __name__ == "__main__":
application = QtWidgets.QApplication([])
window = MainWindow()
window.setWindowTitle("Main window")
window.show()
sys.exit(application.exec_())
Ответы (1 шт):
Я бы посоветовал внимательно изучить то, чем с вами поделился @gil9red - это пойдет вам на пользу!
Мне почему-то показалось, что вам надо менять книгу. Я не проверял как работает ваш пример, а только добавил то, что вы спрашивали.
По нажатию кнопки Open file добавим выбранный файла в плейлист и в список,
который добавим в виджет list_widget для визуализации.
Я вообще не нажимал на ваши кнопки, но если вы сделаете двойной клик
по любому элементу в list_widget , то вы получите его воспроизведение.
Заполните files = ['bibi.mp3', ...] какими-нибудь своими файлами.
Я отметил строки, в который внес изменения, пробуйте.
import sys, os
from PyQt5 import QtWidgets, QtCore, QtMultimedia, QtGui
class AudioPlayer(QtWidgets.QWidget):
def __init__(self, parent = None):
super(AudioPlayer, self).__init__(parent, flags = QtCore.Qt.Window | QtCore.Qt.MSWindowsFixedSizeDialogHint)
self.setWindowTitle("Audio Player")
self.mplPlayer = QtMultimedia.QMediaPlayer()
self.mplPlayer.setVolume(50)
self.mplPlayer.mediaStatusChanged.connect(self.init_player)
self.mplPlayer.stateChanged.connect(self.set_player_state)
self.playlist = QtMultimedia.QMediaPlaylist()
self.list_widget = QtWidgets.QListWidget(self) # +++
self.list_widget.doubleClicked.connect(self.list_play_func) # +++ doubleClicked !
# files = ["Musical files here"]
files = ['bibi.mp3', # добавите немного своего
'D:/_Qt/Mp3/alarm.mp3',
'D:/_Qt/EXE/Mp3/new_build/QThread_mp3/img/zvuki_prirody.mp3']
for f in files:
# fn = QtCore.QUrl.fromLocalFile(os.path.abspath(f))
self.playlist.addMedia(QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(f))) # +
self.playlist.setPlaybackMode(QtMultimedia.QMediaPlaylist.Loop) # +
self.list_widget.addItems([m.split('/')[-1] for m in files]) # +++ !!!
self.playlist.setCurrentIndex(0)
self.mplPlayer.setPlaylist(self.playlist)
button_next = QtWidgets.QPushButton("⏯")
button_previous = QtWidgets.QPushButton("⏮")
button_shuffle = QtWidgets.QPushButton("?")
h1layout = QtWidgets.QHBoxLayout()
h1layout.addWidget(button_next)
h1layout.addWidget(button_previous)
h1layout.addWidget(button_shuffle)
button_next.clicked.connect(self.playlist.next)
button_previous.clicked.connect(self.playlist.previous)
button_shuffle.clicked.connect(self.playlist.shuffle)
vlayout = QtWidgets.QVBoxLayout()
button_open = QtWidgets.QPushButton("&Open file")
button_open.clicked.connect(self.open_file)
vlayout.addWidget(button_open)
self.sldPosition = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.sldPosition.setMinimum(0)
self.sldPosition.sliderMoved[int].connect(self.setPlayPosition)
self.mplPlayer.positionChanged.connect(self.sldPosition.setValue)
self.mplPlayer.durationChanged.connect(self.get_duration_func) # +++ !!!
self.sldPosition.setEnabled(False)
vlayout.addWidget(self.sldPosition)
hlayout = QtWidgets.QHBoxLayout()
self.button_play = QtWidgets.QPushButton(" ▶️ ")
self.button_play.setFixedSize(70, 30)
self.button_play.clicked.connect(self.mplPlayer.play)
self.button_play.setEnabled(False)
hlayout.addWidget(self.button_play)
self.button_pause = QtWidgets.QPushButton("||")
self.button_pause.setFixedSize(70, 30)
self.button_pause.clicked.connect(self.mplPlayer.pause)
self.button_pause.setEnabled(False)
hlayout.addWidget(self.button_pause)
self.button_stop = QtWidgets.QPushButton("⏹")
self.button_stop.setFixedSize(70, 30)
self.button_stop.clicked.connect(self.mplPlayer.stop)
self.button_stop.setEnabled(False)
hlayout.addWidget(self.button_stop)
hlayout.setAlignment(QtCore.Qt.AlignLeft)
vlayout.addLayout(hlayout)
vlayout.addLayout(h1layout)
hlayout = QtWidgets.QHBoxLayout()
label_volume = QtWidgets.QLabel("&Volume")
hlayout.addWidget(label_volume)
slider_volume = QtWidgets.QSlider(QtCore.Qt.Horizontal)
slider_volume.setRange(0, 100)
slider_volume.setTickPosition(QtWidgets.QSlider.TicksAbove)
slider_volume.setTickInterval(10)
slider_volume.setValue(10)
label_volume.setBuddy(slider_volume)
hlayout.addWidget(slider_volume)
button_mute = QtWidgets.QPushButton("&Mute")
button_mute.setCheckable(True)
button_mute.toggled.connect(self.mplPlayer.setMuted)
hlayout.addWidget(button_mute)
vlayout.addLayout(hlayout)
self.label_current = QtWidgets.QLabel("")
vlayout.addWidget(self.label_current)
vlayout.addWidget(self.list_widget) # +++ !!!
self.playlist.currentMediaChanged.connect(self.show_File)
self.setLayout(vlayout)
self.resize(300, 100)
def show_File(self, content):
self.label_current.setText(content.canonicalUrl().fileName())
# !!!
def open_file(self): # +++ !!!
# file = QtWidgets.QFileDialog.getOpenFileUrl(parent = self,
# caption = "Choose musical file: ",
# filter = "Musical files (*.mp3 *.ac3)")
# self.mplPlayer.setMedia(QtMultimedia.QMediaContent(file[0]))
file, _ = QtWidgets.QFileDialog.getOpenFileName(
self,
"Add Sound",
"",
"Sound Filed(*.mp3 *.ac3 *.wav)"
)
if not file: # !!!
return
self.playlist.addMedia(QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(file))) # +
self.list_widget.addItem(file.split('/')[-1]) # + !!!
def init_player(self, state):
if state == QtMultimedia.QMediaPlayer.LoadedMedia:
self.mplPlayer.stop()
self.button_play.setEnabled(True)
self.sldPosition.setEnabled(True)
self.sldPosition.setMaximum(self.mplPlayer.duration())
elif state == QtMultimedia.QMediaPlayer.NoMedia or state == QtMultimedia.QMediaPlayer.InvalidMedia:
self.sldPosition.setValue(0)
self.sldPosition.setEnabled(False)
self.button_play.setEnabled(False)
self.button_stop.setEnabled(False)
self.button_pause.setEnabled(False)
def set_player_state(self, state):
if state == QtMultimedia.QMediaPlayer.StoppedState:
self.sldPosition.setValue(0)
self.button_pause.setEnabled(False)
self.button_stop.setEnabled(False)
elif state == QtMultimedia.QMediaPlayer.PlayingState:
self.button_pause.setEnabled(True)
self.button_stop.setEnabled(True)
elif state == QtMultimedia.QMediaPlayer.PausedState:
self.button_pause.setEnabled(False)
self.button_stop.setEnabled(True)
def setPlayPosition(self, value):
self.mplPlayer.setPosition(value)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv !!!
def list_play_func(self):
self.mplPlayer.stop()
self.playlist.setCurrentIndex(self.list_widget.currentRow())
self.mplPlayer.play()
def get_duration_func(self, d):
self.sldPosition.setRange(0, d)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ !!!
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
button_player = QtWidgets.QPushButton("&Audio Player")
button_player.clicked.connect(self.open_player)
hlayout = QtWidgets.QHBoxLayout(self)
hlayout.addWidget(button_player)
def open_player(self):
self.window = AudioPlayer(self)
self.window.resize(400, 200)
self.window.show()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.setWindowTitle("Main window234")
w.show()
sys.exit(app.exec_())
