Функция добавить/сохранить 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 шт):

Автор решения: S. Nick

Я бы посоветовал внимательно изучить то, чем с вами поделился @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_())

введите сюда описание изображения

→ Ссылка