首页 > 编程语言 >用Python和PyQt5打造你的专属音乐播放器!轻松创建带封面的音乐列表

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

时间:2024-08-05 16:55:13浏览次数:17  
标签:song Python self 音乐 list covers 歌曲 PyQt5 songs

在本文中,我们将介绍如何使用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. 媒体库管理

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

总结

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

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

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

结论

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

标签:song,Python,self,音乐,list,covers,歌曲,PyQt5,songs
From: https://blog.csdn.net/m0_74972192/article/details/140856305

相关文章

  • 了解 Databricks 文件系统 (DBFS) 中的文件访问与使用 Python 和 Spark 的卷的比较
    我当前正在尝试从Databricks文件系统(DBFS)读取和显示文件,但遇到了问题。这是我使用的代码:file_path="/dbfs/cluster-logs/use_case/default_job_cluster/cluster_id/init_scripts/cluster_id/20240801_proxy-init.sh.stderr.log"withopen(file_path,'r')asfile:......
  • 机器学习用python还是R,哪个更好?
    选择使用Python还是R进行机器学习取决于多个因素,包括您的具体需求、项目要求、个人偏好以及团队的技能水平。以下是一些关键点,可以帮助您做出决定:Python的优势广泛使用:Python是目前最流行的编程语言之一,特别是在数据科学和机器学习领域。它有一个庞大的社区和丰富的资源。......
  • python 元类:在调用“__set_name__”方法后编辑命名空间?
    假设我们用元类定义一个类。在类主体中,分配了对象,这些对象实现__set_name__以在类的数据结构中注册自身。是否可以在运行方法之后编辑命名空间?比如,分离填充的数据结构,将其分成两部分,然后在新属性下添加部分?__set_name__问题在于,在元类中调用之......
  • 无法加入进程,只能终止[Python 3.11,多处理]
    我有一个问题要问对Python的多处理库有更​​多经验的人,此时我几乎迷失了方向。我目前正在构建一个应该在Windows11和Windows11上运行的图像处理应用程序装有DebianLinux的OrangePi5。我的设置是,除了主程序之外,还有另外两个进程,一个用于处理不间断的......
  • Python 将Word转换为JPG、PNG、SVG图片
    将Word文档以图片形式导出,既能方便信息的分享,也能保护数据安全,避免被二次编辑。文本将介绍如何使用 Spire.DocforPython 库在Python程序中实现Word到图片的批量转换。Python将Word转换为JPG、JPEG、PNG、BMP等图片格式Python将Word文档转换为SVG格式 Python库安装: ......
  • C 和 Python 代码的函数的不同十六进制转储值
    这是我的示例C代码,用于从user32.dll中转储MessageBoxA:#include<windows.h>#include<stdio.h>voidDumpFun(HANDLEprocess,LPVOIDaddress,SIZE_Tdump_size){BYTE*buffer=(BYTE*)malloc(dump_size);if(buffer==NULL){pri......
  • 是否有对数累积分布函数 (CDF) 和分位数函数的数值稳定的 Python 实现?
    我正在寻找以下函数的数值稳定实现。由于我的应用涉及t分布,所以我这里以t分布为例。LogCDF#NaivePythonimplementationofthefunctionIneedimportscipyimportnumpyasnpdeft_log_cdf(x,df):p=scipy.stats.t.cdf(x,df=df)returnnp.log(......
  • 如何将 *args 参数作为字符串传递给 Python 函数
    我正在使用pytubefix制作一个Youtube下载器。API允许我编写如下代码:YouTube(url).streams.filter(progressive=True)但是假设我有一个字符串存储在像args="progressive=True"这样的变量中,我如何使用args字符串来调用函数,就像......
  • Python Telegram Bot 从数据库获取数据时出错
    我正在开发用于管理企业用途任务的电报机器人。团队负责人注册他的公司并获得唯一的ID,然后可以分配任务。问题是,当团队负责人分配任务时,他可以使用/viewtasks访问它们。但是,当员工尝试查看任务时,它会打印出“错误。您尚未注册”。似乎无法检索与用户关联的company_id,即使......
  • 在 Glue 作业中使用 python3+ 创建 CloudFront 签名 URL
    是否可以使用python3+为GlueJob中S3文件中的一个特定文件创建具有一定时间限制的CloudFront签名URL?我看到可以在Lambda中做到这一点,但在Python文档中找不到任何内容,特别是胶水工作。任何人都可以提供一些提示吗?defload_private_key(key_path):withopen(......