用不到100行 Python 制作简易音乐播放器教程

在这篇博客中,我们将使用 Python 的 PyQt5 和 pygame 库来创建一个简单的音乐播放器应用程序。我们的音乐播放器将具有基本的播放、暂停、上一首和下一首功能。

导入所需的库

首先,我们需要导入我们将在应用程序中使用的库:

import os
import pygame
import qtawesome as qta
from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QPixmap, QIcon, QBrush
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget, QMessageBox, QHBoxLayout, QVBoxLayout

创建 MusicPlayer 类

接下来,我们创建一个名为 MusicPlayer 的类,它继承自 QMainWindow

class MusicPlayer(QMainWindow):
    def __init__(self, music_folder):
        super().__init__()
        self.setWindowTitle("LIY若依播放器")
        self.setGeometry(100, 100, 2500, 1300)
        self.setMinimumSize(2500, 1300)
        self.setFixedSize(2500, 1300)
        self.set_background("Anime-transformed.png")
        pygame.mixer.init()
        self.music_folder = music_folder
        self.playlist = self.load_playlist()
        self.current_track_index = 0
        self.create_widgets()

在 __init__ 方法中,我们初始化了一些基本的属性,如窗口标题、窗口大小、背景图片等。我们还初始化了 pygame 的音乐混音器,并加载了播放列表。

设置背景图片

我们使用 set_background 方法来设置窗口的背景图片:

def set_background(self, image_path):
    self.setAutoFillBackground(True)
    palette = self.palette()
    pixmap = QPixmap(image_path).scaled(self.size(), Qt.KeepAspectRatioByExpanding, Qt.SmoothTransformation)
    brush = QBrush(pixmap)
    palette.setBrush(self.backgroundRole(), brush)
    self.setPalette(palette)

加载播放列表

我们使用 load_playlist 方法来加载播放列表:

def load_playlist(self):
    playlist = [os.path.join(self.music_folder, f) for f in os.listdir(self.music_folder) if f.endswith('.mp3')]
    if not playlist:
        error_dialog = QMessageBox(self)
        error_dialog.setIcon(QMessageBox.Critical)
        error_dialog.setText("在指定目录中未找到MP3文件")
        error_dialog.setWindowTitle("错误")
        error_dialog.exec_()
        self.close()
    return playlist

创建 UI 元素

我们使用 create_widgets 方法来创建 UI 元素:

def create_widgets(self):
    main_layout = QVBoxLayout()
    widget = QWidget(self)
    widget.setLayout(main_layout)
    self.setCentralWidget(widget)

    button_layout = QHBoxLayout()

    self.prev_button = QPushButton()
    self.prev_button.setIcon(QIcon(qta.icon('fa.backward')))
    self.prev_button.setIconSize(QSize(64, 64))  # 设置图标大小
    self.prev_button.setStyleSheet("background: transparent; border: none;")
    self.prev_button.clicked.connect(self.prev_track)
    button_layout.addWidget(self.prev_button, alignment=Qt.AlignCenter)

    self.play_pause_button = QPushButton()
    self.play_pause_button.setIcon(QIcon(qta.icon('fa.play')))
    self.play_pause_button.setIconSize(QSize(64, 64))  # 设置图标大小
    self.play_pause_button.setStyleSheet("background: transparent; border: none;")
    self.play_pause_button.clicked.connect(self.play_pause)
    button_layout.addWidget(self.play_pause_button, alignment=Qt.AlignCenter)
    
    self.next_button = QPushButton()
    self.next_button.setIcon(QIcon(qta.icon('fa.forward')))
    self.next_button.setIconSize(QSize(64, 64))  # 设置图标大小
    self.next_button.setStyleSheet("background: transparent; border: none;")
    self.next_button.clicked.connect(self.next_track)
    button_layout.addWidget(self.next_button, alignment=Qt.AlignCenter)
    main_layout.addStretch(1)
    main_layout.addLayout(button_layout)

播放和暂停音乐

我们使用 play_pause 方法来播放和暂停音乐:

def play_pause(self):
    if pygame.mixer.music.get_busy():
        pygame.mixer.music.pause()
        self.play_pause_button.setIcon(QIcon(qta.icon('fa.play')))
    else:
        if not pygame.mixer.music.get_pos() > 0:
            self.play_track()
        else:
            pygame.mixer.music.unpause()
        self.play_pause_button.setIcon(QIcon(qta.icon('fa.pause')))

播放音乐

我们使用 play_track 方法来播放音乐:

def play_track(self):
    if self.playlist:
        pygame.mixer.music.load(self.playlist[self.current_track_index])
        pygame.mixer.music.play()
        self.setWindowTitle(f"正在播放: {os.path.basename(self.playlist[self.current_track_index])}")

播放上一首和下一首音乐

我们使用 prev_track 和 next_track 方法来播放上一首和下一首音乐:

def prev_track(self):
    self.current_track_index = (self.current_track_index - 1) % len(self.playlist)
    self.play_track()

def next_track(self):
    self.current_track_index = (self.current_track_index + 1) % len(self.playlist)
    self.play_track()

运行应用程序

最后,我们在主程序中创建 MusicPlayer 的实例,并运行应用程序:

if __name__ == "__main__":
    music_folder = r"D:\kugou"
    app = QApplication([])
    player = MusicPlayer(music_folder)
    player.show()
    app.exec_()

效果如下:

完整代码如下:

import os
import pygame
import qtawesome as qta
from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QPixmap, QIcon, QBrush
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget, QMessageBox, QHBoxLayout, QVBoxLayout

class MusicPlayer(QMainWindow):
    def __init__(self, music_folder):
        super().__init__()
        self.setWindowTitle("LIY若依播放器")
        self.setGeometry(100, 100, 2500, 1300)
        self.setMinimumSize(2500, 1300)
        self.setFixedSize(2500, 1300)
        self.set_background("Anime-transformed.png")
        pygame.mixer.init()
        self.music_folder = music_folder
        self.playlist = self.load_playlist()
        self.current_track_index = 0
        self.create_widgets()

    def set_background(self, image_path):
        self.setAutoFillBackground(True)
        palette = self.palette()
        pixmap = QPixmap(image_path).scaled(self.size(), Qt.KeepAspectRatioByExpanding, Qt.SmoothTransformation)
        brush = QBrush(pixmap)
        palette.setBrush(self.backgroundRole(), brush)
        self.setPalette(palette)

    def load_playlist(self):
        playlist = [os.path.join(self.music_folder, f) for f in os.listdir(self.music_folder) if f.endswith('.mp3')]
        if not playlist:
            error_dialog = QMessageBox(self)
            error_dialog.setIcon(QMessageBox.Critical)
            error_dialog.setText("在指定目录中未找到MP3文件")
            error_dialog.setWindowTitle("错误")
            error_dialog.exec_()
            self.close()
        return playlist

    def create_widgets(self):
        main_layout = QVBoxLayout()
        widget = QWidget(self)
        widget.setLayout(main_layout)
        self.setCentralWidget(widget)

        button_layout = QHBoxLayout()

        self.prev_button = QPushButton()
        self.prev_button.setIcon(QIcon(qta.icon('fa.backward', options=[{'color': 'white'}])))
        self.prev_button.setIconSize(QSize(64, 64))  # 设置图标大小
        self.prev_button.setStyleSheet("background: transparent; border: none;")
        self.prev_button.clicked.connect(self.prev_track)
        button_layout.addWidget(self.prev_button, alignment=Qt.AlignCenter)

        self.play_pause_button = QPushButton()
        self.play_pause_button.setIcon(QIcon(qta.icon('fa.play', options=[{'color': 'white'}])))
        self.play_pause_button.setIconSize(QSize(64, 64))  # 设置图标大小
        self.play_pause_button.setStyleSheet("background: transparent; border: none;")
        self.play_pause_button.clicked.connect(self.play_pause)
        button_layout.addWidget(self.play_pause_button, alignment=Qt.AlignCenter)

        self.next_button = QPushButton()
        self.next_button.setIcon(QIcon(qta.icon('fa.forward', options=[{'color': 'white'}])))
        self.next_button.setIconSize(QSize(64, 64))  # 设置图标大小
        self.next_button.setStyleSheet("background: transparent; border: none;")
        self.next_button.clicked.connect(self.next_track)
        button_layout.addWidget(self.next_button, alignment=Qt.AlignCenter)
        main_layout.addStretch(1)
        main_layout.addLayout(button_layout)

    def play_pause(self):
        if pygame.mixer.music.get_busy():
            pygame.mixer.music.pause()
            self.play_pause_button.setIcon(QIcon(qta.icon('fa.play', options=[{'color': 'white'}])))
        else:
            if not pygame.mixer.music.get_pos() > 0:
                self.play_track()
            else:
                pygame.mixer.music.unpause()
            self.play_pause_button.setIcon(QIcon(qta.icon('fa.pause', options=[{'color': 'white'}])))

    def play_track(self):
        if self.playlist:
            pygame.mixer.music.load(self.playlist[self.current_track_index])
            pygame.mixer.music.play()
            self.setWindowTitle(f"正在播放: {os.path.basename(self.playlist[self.current_track_index])}")

    def prev_track(self):
        self.current_track_index = (self.current_track_index - 1) % len(self.playlist)
        self.play_track()

    def next_track(self):
        self.current_track_index = (self.current_track_index + 1) % len(self.playlist)
        self.play_track()

if __name__ == "__main__":
    music_folder = r"D:\kugou"
    app = QApplication([])
    player = MusicPlayer(music_folder)
    player.show()
    app.exec_()

这就是我的音乐播放器应用程序的全部代码。希望你喜欢这篇博客,并从中学到了一些有用的知识。如果你有任何问题或者建议,欢迎在评论区留言。😊

作者:LIY若依

物联沃分享整理
物联沃-IOTWORD物联网 » 用不到100行 Python 制作简易音乐播放器教程

发表回复