用Python和PyQt5打造你的专属音乐播放器!轻松创建带封面的音乐列表

在本文中,我们将介绍如何使用Python的PyQt5库创建一个简单的音乐播放器。这个音乐播放器可以显示歌曲的封面,并且点击封面就可以播放对应的歌曲。

依赖库

首先,我们需要安装PyQt5库。可以使用以下命令进行安装:

pip install PyQt5

功能如下:

  1. 显示歌曲列表:程序会在指定的目录(在这个例子中是"D:/song")中搜索所有的.mp3文件和.jpg文件。每一首歌曲都会与一个封面图片配对,并显示在列表中。

  2. 点击播放音乐:当你点击列表中的一首歌(或者说,点击一张封面图片)时,程序会开始播放对应的音乐。

说明

这个音乐播放器可以显示歌曲的封面,并且点击封面就可以播放对应的歌曲。我们通过逐步解析代码片段的方式,详细讲解了每个步骤和代码的功能。

代码解析

1. 导入所需的模块和库

import os
import sys

from PyQt5.QtCore import QUrl, QSize, Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QListWidget, QListWidgetItem, QVBoxLayout

这些导入语句包含了我们需要的所有PyQt5模块和其他标准库。

2. 定义全局变量

# Directory where your songs and covers are located
SONG_DIR = "D:/song"

这里定义了一个全局变量SONG_DIR,用于存放你的歌曲和封面的目录。

3. 创建主窗口类

class HomePage(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

我们定义了一个名为HomePage的类,这个类继承自QWidget。在这个类中,我们定义了一些方法来初始化UI,获取歌曲和封面,以及播放歌曲。

4. 初始化UI

def initUI(self):
    self.setWindowTitle('LIY若依_音乐播放器')
    self.setGeometry(100, 100, 600, 500)

    self.layout = QVBoxLayout()
    self.setLayout(self.layout)

    # Title label
    self.title_label = QLabel('LIY若依_音乐播放器', self)
    self.title_label.setStyleSheet('font-size: 24px; font-weight: bold; margin-bottom: 20px;')
    self.layout.addWidget(self.title_label, alignment=Qt.AlignCenter)

    # Song list
    self.song_list = QListWidget(self)
    self.song_list.setStyleSheet('QListWidget { background-color: #f0f0f0; border: none; }')
    self.song_list.setViewMode(QListWidget.IconMode)
    self.song_list.setIconSize(QSize(250, 250))
    self.song_list.setSpacing(10)
    self.song_list.setResizeMode(QListWidget.Adjust)
    self.layout.addWidget(self.song_list)

    # Load songs and covers
    songs_with_covers = self.get_songs_with_covers()
    for song_info in songs_with_covers:
        item = QListWidgetItem()
        item.setText(song_info['song'].replace('.mp3', ''))
        cover_path = os.path.join(SONG_DIR, song_info['cover'])
        item.setIcon(QIcon(cover_path))
        item.setData(Qt.UserRole, song_info)  # Store song info as data
        self.song_list.addItem(item)

    # Audio player
    self.mediaPlayer = QMediaPlayer(self)

    # Connect item clicked signal
    self.song_list.itemClicked.connect(self.play_song)

    self.show()

initUI方法中,我们创建了一个标题标签,一个歌曲列表,以及一个音频播放器。我们还连接了歌曲列表的itemClicked信号到play_song方法,这样当用户点击一个歌曲时,就会播放对应的歌曲。

5. 获取歌曲和封面

def get_songs_with_covers(self):
    songs = [f for f in os.listdir(SONG_DIR) if f.endswith('.mp3')]
    covers = [f for f in os.listdir(SONG_DIR) if f.endswith('.jpg')]

    # Sort songs and covers for consistent ordering
    songs.sort()
    covers.sort()

    songs_with_covers = []
    for song in songs:
        # Assuming cover image has the same name as the song
        song_name = os.path.splitext(song)[0]
        cover_name = song_name + '.jpg'
        if cover_name in covers:
            songs_with_covers.append({'song': song, 'cover': cover_name})

    return songs_with_covers

get_songs_with_covers方法中,我们获取了所有的歌曲和封面,并将它们配对起来。

6. 播放歌曲

def play_song(self, item):
    song_info = item.data(Qt.UserRole)
    song_filename = song_info['song']
    song_path = os.path.join(SONG_DIR, song_filename)
    self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(song_path)))
    self.mediaPlayer.play()

play_song方法中,我们获取了被点击的歌曲的信息,然后使用QMediaPlayer播放这首歌曲。

7. 主函数

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = HomePage()
    sys.exit(app.exec_())

最后,我们在主函数中创建了一个QApplication实例和一个HomePage实例,然后进入了应用程序的主循环。

完整代码如下:

import os
import sys

from PyQt5.QtCore import QUrl, QSize, Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QListWidget, QListWidgetItem, QVBoxLayout

# Directory where your songs and covers are located
SONG_DIR = "D:/song"


class HomePage(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('LIY若依_音乐播放器')
        self.setGeometry(100, 100, 600, 500)

        self.layout = QVBoxLayout()
        self.setLayout(self.layout)

        # Title label
        self.title_label = QLabel('LIY若依_音乐播放器', self)
        self.title_label.setStyleSheet('font-size: 24px; font-weight: bold; margin-bottom: 20px;')
        self.layout.addWidget(self.title_label, alignment=Qt.AlignCenter)

        # Song list
        self.song_list = QListWidget(self)
        self.song_list.setStyleSheet('QListWidget { background-color: #f0f0f0; border: none; }')
        self.song_list.setViewMode(QListWidget.IconMode)
        self.song_list.setIconSize(QSize(250, 250))
        self.song_list.setSpacing(10)
        self.song_list.setResizeMode(QListWidget.Adjust)
        self.layout.addWidget(self.song_list)

        # Load songs and covers
        songs_with_covers = self.get_songs_with_covers()
        for song_info in songs_with_covers:
            item = QListWidgetItem()
            item.setText(song_info['song'].replace('.mp3', ''))
            cover_path = os.path.join(SONG_DIR, song_info['cover'])
            item.setIcon(QIcon(cover_path))
            item.setData(Qt.UserRole, song_info)  # Store song info as data
            self.song_list.addItem(item)

        # Audio player
        self.mediaPlayer = QMediaPlayer(self)

        # Connect item clicked signal
        self.song_list.itemClicked.connect(self.play_song)

        self.show()

    def get_songs_with_covers(self):
        songs = [f for f in os.listdir(SONG_DIR) if f.endswith('.mp3')]
        covers = [f for f in os.listdir(SONG_DIR) if f.endswith('.jpg')]

        # Sort songs and covers for consistent ordering
        songs.sort()
        covers.sort()

        songs_with_covers = []
        for song in songs:
            # Assuming cover image has the same name as the song
            song_name = os.path.splitext(song)[0]
            cover_name = song_name + '.jpg'
            if cover_name in covers:
                songs_with_covers.append({'song': song, 'cover': cover_name})

        return songs_with_covers

    def play_song(self, item):
        song_info = item.data(Qt.UserRole)
        song_filename = song_info['song']
        song_path = os.path.join(SONG_DIR, song_filename)
        self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(song_path)))
        self.mediaPlayer.play()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = HomePage()
    sys.exit(app.exec_())

代码片段详解

1. 导入所需的模块和库

导入了ossys模块,以及PyQt5库中的一些模块,包括QUrlQSizeQtQIconQMediaPlayerQMediaContentQApplicationQWidgetQLabelQListWidgetQListWidgetItemQVBoxLayout。这些模块和库提供了创建和管理图形用户界面、处理多媒体内容等功能。

2. 定义全局变量

定义了一个全局变量SONG_DIR,用于存放歌曲和封面的目录。

3. 创建主窗口类

定义了一个名为HomePage的类,继承自QWidget。在这个类中,定义了一些方法来初始化UI,获取歌曲和封面,以及播放歌曲。

4. 初始化UI

initUI方法中,设置了窗口标题和大小,创建了一个垂直布局,并将其设置为主窗口的布局。然后,创建了一个标题标签,并将其添加到布局中。接着,创建了一个歌曲列表,并设置其样式、视图模式、图标大小、间距和调整模式。将歌曲列表添加到布局中。

5. 加载歌曲和封面

调用get_songs_with_covers方法获取歌曲和封面,并将其添加到歌曲列表中。为每首歌曲创建一个QListWidgetItem,设置其文本为歌曲名,图标为封面图片,并将歌曲信息存储为数据。将每个QListWidgetItem添加到歌曲列表中。

6. 创建音频播放器

创建一个QMediaPlayer实例,用于播放音频。

7. 连接信号和槽

将歌曲列表的itemClicked信号连接到play_song方法,这样当用户点击一个歌曲时,就会播放对应的歌曲。

8. 获取歌曲和封面

get_songs_with_covers方法中,获取所有的歌曲和封面,并将它们配对起来。假设封面图片与歌曲同名(扩展名不同),将配对好的歌曲和封面信息存储在一个列表中并返回。

9. 播放歌曲

play_song方法中,获取被点击的歌曲的信息,然后使用QMediaPlayer播放这首歌曲。具体步骤包括获取歌曲文件名和路径,设置媒体内容,并调用play方法播放歌曲。

10. 主函数

在主函数中,创建一个QApplication实例和一个HomePage实例,然后进入应用程序

运行结果

运行上述代码后,你将看到一个简单的音乐播放器界面,点击歌曲封面即可播放对应的歌曲。

效果图:

相关类型推荐

如果你对这个项目感兴趣,以下是一些相关类型的项目推荐:

  1. 视频播放器:使用PyQt5创建一个简单的视频播放器,支持播放本地视频文件。
  2. 图片浏览器:使用PyQt5创建一个图片浏览器,支持查看和管理本地图片文件。
  3. 音频编辑器:使用PyQt5创建一个简单的音频编辑器,支持剪辑、合并和转换音频文件。
  4. 媒体库管理器:使用PyQt5创建一个媒体库管理器,支持管理和分类本地的音频、

     爬虫项目推荐

    其他项目推荐

扩展

  1. 播放列表功能

    • 添加一个播放列表窗口,用户可以创建、编辑和保存播放列表。
    • 支持将歌曲拖放到播放列表中。
  2. 音量控制

    • 添加一个音量控制滑块,用户可以调整播放音量。
    • 支持静音功能。
  3. 播放进度条

    • 添加一个播放进度条,显示当前播放进度。
    • 支持拖动进度条来调整播放位置。
  4. 播放模式

    • 添加循环播放、随机播放和单曲循环等播放模式。
  5. 歌词显示

    • 支持显示歌曲的歌词,并同步滚动。
  6. 均衡器

    • 添加一个简单的均衡器,用户可以调整音频的高低音效果。
  7. 快捷键支持

    • 添加一些快捷键,用户可以通过键盘控制播放、暂停、下一首、上一首等操作。
  8. 界面美化

    • 优化界面设计,添加更多的主题和皮肤选择。
    • 支持自定义背景图片和颜色。
  9. 文件格式支持

    • 扩展支持更多的音频文件格式,如FLAC、WAV等。
  10. 媒体库管理

    • 添加一个媒体库管理功能,用户可以管理和分类本地的音频文件。

总结

通过上述步骤,我们成功创建了一个简单的音乐播放器。这个播放器的主要功能包括:

  • 显示歌曲的封面
  • 点击封面播放对应的歌曲

你可以根据需要进一步扩展和优化这个播放器,例如添加播放列表、音量控制、播放进度条等功能。

结论

通过上述步骤,我们成功创建了一个简单的音乐播放器。你可以根据需要进一步扩展和优化这个播放器,希望这个项目对你有所帮助!欢迎在评论区留言。继续探索和学习,祝你在深度学习的旅程中取得更多的成果!🚀


希望这个博客对你有所帮助!如果你有任何问题需要进一步的指导,请随时提问。继续加油! 🚀

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LIY若依

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值