首页 > 编程语言 >教你使用 python 不到100行 制作 音乐播放器

教你使用 python 不到100行 制作 音乐播放器

时间:2024-07-12 23:55:19浏览次数:9  
标签:播放器 play pause python self track music 100 button

在这篇博客中,我们将使用 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_()

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

标签:播放器,play,pause,python,self,track,music,100,button
From: https://blog.csdn.net/m0_74972192/article/details/140357128

相关文章

  • python 校验密码强度
    在我们的日常生活中,密码的安全性是非常重要的。无论是我们的电子邮件账户,社交媒体账户,还是银行账户,都需要一个强大的密码来保护。在这篇文章中,我将向你展示如何使用Python来检查密码的强度。代码解析首先,我们需要导入 string 库。importstring然后,我们定义一个函数......
  • 用python处理excel数据
    1.小技巧:用print()检查代码,可以把想检查的变量作为参数放进括号内打印出来,便于检查2.第三方库:1.xlrd读取excel文件。 2.xlwt写入excel文件。 3.xlutils一组excel高级操作的工具3.xlrd包含四个功能:1.读取有效单元格的行数和列数。2.读取指定行或列所有单元格的值。3.读取......
  • 【Python 基础】列表 - 1
    列表在你能够开始编写程序之前,还有一个主题需要理解,那就是列表数据类型及元组。列表和元组可以包含多个值,这样编写程序来处理大量数据就变得更容易。而且,由于列表本身又可以包含其他列表,所以可以用它们将数据安排成层次结构。列表数据类型“列表”是一个值,它包含多个字构......
  • 【python学习】面向对象编程以及面向对象编程的核心概念和使用方法
    引言Python语言设计之初,就是为了面向对象,所以Python的面向对象更加易于理解。面向对象编程中,我们将现实世界的实体视为对象,每个对象都有属性(数据)和行为(方法)文章目录引言一、面向对象编程是什么二、面向过程编程和面向对象编程的区别2.1面对过程编程2.2面向对象编......
  • 【Python123题库】#查询省会 #字典的属性、方法与应用
    禁止转载,原文:https://blog.csdn.net/qq_45801887/article/details/140081665参考教程:B站视频讲解——https://space.bilibili.com/3546616042621301有帮助麻烦点个赞~~Python123题库查询省会字典的属性、方法与应用查询省会类型:字典‪‬‪‬‪‬‪‬‪‬‮‬‪‬......
  • 超详细Python教程——迭代器和生成器
    迭代器和生成器迭代器是实现了迭代器协议的对象。Python中没有像protocol或interface这样的定义协议的关键字。Python中用魔术方法表示协议。__iter__和__next__魔术方法就是迭代器协议。classFib(object):"""迭代器"""def__init__(self,num):......
  • [SUCTF 2019]Pythonginx 1
    目录题目代码分析urlsplit()nginx文件位置解题题目代码分析fromflaskimportFlask,Blueprint,request,Response,escape,render_templatefromurllib.parseimporturlsplit,urlunsplit,unquotefromurllibimportparseimporturllib.requestapp=......
  • python————集合干货
    1.集合的定义python中的集合是一种无序的,元素不重复的数据结构。定义集合的方式:方式一:        #方式一不可以定义空集合s0={1,2,3,4}print(s0,type(s0))方式二:#方式二s1=set()print(s1,type(s1))s2=set(range(10))print(s0,type(s0))2.集合的......
  • python的视频处理实操宝典
    前言Python视频去抖动是指利用Python编程语言和相关的图像处理库,对视频中由于相机震动或手持拍摄等原因而导致的画面抖动进行处理的技术。视频去抖动的目的是使得视频画面更加稳定,减少抖动,提高观看体验。通常,视频去抖动的实现可以采用多种方法,包括基于帧差的方法、运动估......
  • python:使用matplotlib库绘制图像(四)
    作者是跟着http://t.csdnimg.cn/4fVW0学习的,matplotlib系列文章是http://t.csdnimg.cn/4fVW0的自己学习过程中整理的详细说明版本,对小白更友好哦!四、条形图1.一个数据样本的条形图条形图:常用于比较不同类别的数量或值,以及进行简单的数据分析。直方图:常用于分析数据的集中趋......