Python简易音乐播放器开发教程

article/2025/6/24 0:23:19

📚 前言

编程基础第一期《12-30》–音乐播放器是日常生活中常用的应用程序,使用Python和pygame库可以轻松实现一个简易的音乐播放器。本教程将详细讲解如何开发一个具有基本功能的音乐播放器,并解析其中涉及的Python编程知识点。

🛠️ 开发环境准备-音乐获取

从酷狗音乐中单个获取,需要先登录

在这里插入图片描述

import requests
import json
headers = {'accept': '*/*','accept-language': 'zh-CN,zh;q=0.9','cache-control': 'no-cache','origin': 'https://www.kugou.com','pragma': 'no-cache','priority': 'u=1, i','referer': 'https://www.kugou.com/','sec-ch-ua': '"Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="99"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"','sec-fetch-dest': 'empty','sec-fetch-mode': 'cors','sec-fetch-site': 'same-site','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36',
}params = {'srcappid': '2919','clientver': '20000','clienttime': '1748689562754','mid': '9c90f73615e8fc1dee91f84b68332ed8','uuid': '9c90f73615e8fc1dee91f84b68332ed8','dfid': '1Jbra41JOyPa2zrk752ps3YA','appid': '1014','platid': '4','encode_album_audio_id': 'bwnubuc3','token': '0837e5097e56fabd6e9164d753b05b7c073a6a393bf34fb687bd69cf80d623e8','userid': '660825514','signature': '63e40caebe53219e46622202bc5112a1',
}
# 获取内容
response = requests.get('https://wwwapi.kugou.com/play/songinfo', params=params, headers=headers).text
data = json.loads(response) # 转换成json格式
res = requests.get(data['data']['play_url'], headers=headers) # 再次发起请求,获取音乐
# 标题
title = data['data']['audio_name']
with open(f'{title}.mp3', 'wb') as f:f.write(res.content)print("下载完成")f.close()

那么单个音乐就下载好了菲菲公主(陆绮菲) - 第57次取消发送.mp3

请求头如何获取在Python爬虫实战:抓取百度15天天气预报数据-CSDN博客这篇文章中讲过了

  • pygame库
  • tkinter库(Python标准库,用于GUI界面)

安装pygame库:pip install pygame

🧩 核心功能概述

  1. 音乐文件选择:允许用户从文件系统中选择音乐文件
  2. 播放控制:播放、暂停、停止、调整音量
  3. 播放列表管理:添加、删除、显示音乐文件
  4. 界面显示:简洁的图形用户界面

💡 代码实现与知识点解析

1. 导入必要的库

import pygame
import tkinter as tk
from tkinter import filedialog, messagebox
import os
import time
from threading import Thread

知识点

  • pygame:Python游戏开发库,提供音频处理功能
  • tkinter:Python标准GUI库,用于创建图形界面
  • os:操作系统接口,用于文件路径处理
  • threading:线程管理,用于后台播放音乐

2. 初始化pygame和音频系统

# 初始化pygame
pygame.init()
# 初始化音频系统
pygame.mixer.init()

知识点

  • pygame.init():初始化所有pygame模块
  • pygame.mixer.init():初始化音频系统,为音乐播放做准备

3. 创建音乐播放器类

class MusicPlayer:def __init__(self, root):self.root = rootself.root.title("Python简易音乐播放器")self.root.geometry("500x400")self.root.resizable(False, False)self.root.configure(bg="#f0f0f0")# 音乐播放状态self.is_playing = Falseself.current_track = Noneself.playlist = []# 创建界面self.create_ui()# 更新播放状态的线程self.update_thread = Thread(target=self.update_play_state)self.update_thread.daemon = Trueself.update_thread.start()

知识点

  • 类的定义与初始化:面向对象编程
  • GUI窗口配置:设置标题、大小、背景色
  • 线程使用:创建后台线程监控播放状态

4. 创建用户界面

def create_ui(self):# 标题标签self.title_label = tk.Label(self.root, text="Python简易音乐播放器", font=("Arial", 16), bg="#f0f0f0")self.title_label.pack(pady=10)# 当前播放标签self.current_label = tk.Label(self.root, text="当前未播放任何音乐", font=("Arial", 10), bg="#f0f0f0", width=45)self.current_label.pack(pady=5)# 播放列表框self.listbox_frame = tk.Frame(self.root)self.listbox_frame.pack(pady=5)self.playlist_box = tk.Listbox(self.listbox_frame, width=60, height=10)self.playlist_box.pack(side=tk.LEFT, fill=tk.BOTH)self.scrollbar = tk.Scrollbar(self.listbox_frame)self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)self.playlist_box.config(yscrollcommand=self.scrollbar.set)self.scrollbar.config(command=self.playlist_box.yview)# 播放控制按钮框self.control_frame = tk.Frame(self.root, bg="#f0f0f0")self.control_frame.pack(pady=10)# 播放按钮self.play_button = tk.Button(self.control_frame, text="播放", width=8, command=self.play_music)self.play_button.grid(row=0, column=0, padx=5)# 暂停按钮self.pause_button = tk.Button(self.control_frame, text="暂停", width=8, command=self.pause_music)self.pause_button.grid(row=0, column=1, padx=5)# 停止按钮self.stop_button = tk.Button(self.control_frame, text="停止", width=8, command=self.stop_music)self.stop_button.grid(row=0, column=2, padx=5)# 添加音乐按钮self.add_button = tk.Button(self.control_frame, text="添加音乐", width=8, command=self.add_music)self.add_button.grid(row=0, column=3, padx=5)# 删除音乐按钮self.remove_button = tk.Button(self.control_frame, text="删除音乐", width=8, command=self.remove_music)self.remove_button.grid(row=0, column=4, padx=5)# 音量控制框self.volume_frame = tk.Frame(self.root, bg="#f0f0f0")self.volume_frame.pack(pady=5)self.volume_label = tk.Label(self.volume_frame, text="音量:", bg="#f0f0f0")self.volume_label.grid(row=0, column=0, padx=5)self.volume_scale = tk.Scale(self.volume_frame, from_=0, to=100, orient=tk.HORIZONTAL, command=self.set_volume)self.volume_scale.set(70)  # 默认音量70%self.volume_scale.grid(row=0, column=1, padx=5)# 设置初始音量pygame.mixer.music.set_volume(0.7)# 双击播放self.playlist_box.bind("<Double-1>", self.play_selected)

知识点

  • tkinter布局管理:pack、grid布局方式
  • 控件使用:Label、Button、Listbox、Scrollbar、Scale等
  • 事件绑定:将双击事件绑定到播放功能

5. 音乐播放控制功能

def add_music(self):"""添加音乐到播放列表"""file_paths = filedialog.askopenfilenames(title="选择音乐文件",filetypes=(("音频文件", "*.mp3 *.wav *.ogg"), ("所有文件", "*.*")))for path in file_paths:if path:# 获取文件名filename = os.path.basename(path)self.playlist.append(path)self.playlist_box.insert(tk.END, filename)def remove_music(self):"""从播放列表中删除选中的音乐"""try:selected_index = self.playlist_box.curselection()[0]self.playlist_box.delete(selected_index)self.playlist.pop(selected_index)# 如果删除的是正在播放的曲目,则停止播放if self.current_track == selected_index:self.stop_music()self.current_track = Noneexcept IndexError:messagebox.showinfo("提示", "请先选择要删除的音乐")def play_selected(self, event=None):"""播放选中的音乐"""try:selected_index = self.playlist_box.curselection()[0]self.play_music(selected_index)except IndexError:messagebox.showinfo("提示", "请先选择要播放的音乐")def play_music(self, index=None):"""播放音乐"""if not self.playlist:messagebox.showinfo("提示", "播放列表为空,请先添加音乐")return# 如果指定了索引,则播放指定音乐if index is not None:self.current_track = index# 否则,如果当前没有播放,则播放选中的或第一首elif self.current_track is None:try:self.current_track = self.playlist_box.curselection()[0]except IndexError:self.current_track = 0# 加载并播放音乐try:pygame.mixer.music.load(self.playlist[self.current_track])pygame.mixer.music.play()self.is_playing = True# 更新当前播放标签current_file = os.path.basename(self.playlist[self.current_track])self.current_label.config(text=f"当前播放: {current_file}")# 高亮显示当前播放的曲目self.playlist_box.selection_clear(0, tk.END)self.playlist_box.selection_set(self.current_track)self.playlist_box.activate(self.current_track)self.playlist_box.see(self.current_track)except pygame.error:messagebox.showerror("错误", "无法播放所选音乐文件")self.current_track = Nonedef pause_music(self):"""暂停/恢复音乐播放"""if self.is_playing:pygame.mixer.music.pause()self.is_playing = Falseself.pause_button.config(text="恢复")else:pygame.mixer.music.unpause()self.is_playing = Trueself.pause_button.config(text="暂停")def stop_music(self):"""停止音乐播放"""pygame.mixer.music.stop()self.is_playing = Falseself.current_label.config(text="当前未播放任何音乐")self.pause_button.config(text="暂停")def set_volume(self, val):"""设置音量"""volume = float(val) / 100pygame.mixer.music.set_volume(volume)def update_play_state(self):"""更新播放状态(在后台线程中运行)"""while True:if self.is_playing and not pygame.mixer.music.get_busy():# 当前歌曲播放完毕,播放下一首self.root.after(100, self.play_next)time.sleep(0.1)def play_next(self):"""播放下一首音乐"""if not self.playlist:returnif self.current_track is not None and self.current_track < len(self.playlist) - 1:self.current_track += 1self.play_music(self.current_track)else:# 播放列表结束,停止播放self.stop_music()self.current_track = None

知识点

  • 文件对话框:使用filedialog选择音乐文件
  • 音乐控制:使用pygame.mixer.music控制音乐播放
  • 异常处理:使用try/except处理可能的错误
  • 线程同步:使用after方法在主线程中执行函数
  • 事件驱动编程:基于用户操作触发相应功能

6. 主程序入口

def main():# 创建主窗口root = tk.Tk()# 创建音乐播放器实例app = MusicPlayer(root)# 运行主循环root.mainloop()# 退出时清理资源pygame.mixer.quit()pygame.quit()if __name__ == "__main__":main()

效果图

从中添加音乐,就可以直接播放了,当然,可以打包成一个自己的播放器

在这里插入图片描述

📝 总结

通过这个简易音乐播放器项目,我们学习了以下Python编程知识:

  1. pygame库的音频处理功能
  2. tkinter GUI编程
  3. 多线程编程
  4. 事件驱动编程模型
  5. 文件操作和路径处理
  6. 面向对象编程思想
  7. 异常处理

心平能愈三千疾 , 心静可通万事理
鱼不与鳥比翱翔 , 鳥不与鱼比畅游


http://www.hkcw.cn/article/VCBNKFpIgl.shtml

相关文章

【Docker项目实战篇】Docker部署PDF查看器PdfDing

【Docker项目实战篇】Docker部署PDD查看器PdfDing 一、PdfDing介绍1.1 PdfDing简介1.2 PdfDing主要特点1.3 主要使用场景 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Pd…

AE 脚本表达式错误 Default ColorSelectionwhile (true){ break;} }

这个问题卡了我挺久的&#xff0c; 都没有解决&#xff0c; 暂时放在这&#xff0c;有解决办法来写。 也希望看到的朋友能帮忙解答

MyBatis01

目录 一、Mybatis 1.1 什么是 MyBatis&#xff1f; 1.2 ORM思想 Hibernate Mybatis&#xff08;ibatis&#xff09; 持久层技术对比 二、mybatis基础操作流程 2.1 引入jar包 2.2 mybatis核心配置文件 2.3 java文件和sql文件相分离 2.4 mybatis框架核心类&#xff0c…

C56-亲自实现字符串拷贝函数

一 strcpy简介 功能&#xff1a;将源字符串&#xff08;包括 \0&#xff09;复制到目标地址。 原型&#xff1a; char *strcpy(char *dest, const char *src);参数&#xff1a; dest&#xff1a;目标地址&#xff08;需足够大&#xff09;。src&#xff1a;源字符串&#xf…

设计模式——简单工厂模式(创建型)

摘要 本文主要介绍了简单工厂模式&#xff0c;包括其定义、结构、实现方式、适用场景、实战示例以及思考。简单工厂模式是一种创建型设计模式&#xff0c;通过工厂类根据参数决定创建哪一种产品类的实例&#xff0c;封装了对象创建的细节&#xff0c;使客户端无需关心具体类的…

山东大学软件学院项目实训-基于大模型的模拟面试系统-面试官和面试记录的分享功能(2)

本文记录在发布文章时&#xff0c;可以添加自己创建的面试官和面试记录到文章中这一功能的实现。 前端 首先是在原本的界面的底部添加了两个多选框&#xff08;后期需要美化调整&#xff09; 实现的代码&#xff1a; <el-col style"margin-top: 1rem;"><e…

【Hot 100】121. 买卖股票的最佳时机

目录 引言买卖股票的最佳时机我的解题 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;【Hot 100】121. 买卖股票的最佳时机❣️ 寄语&#xff1a;书到用时方恨少&#xff0c;事非经过不知难&#xff01; 引…

《Spring Cloud Gateway 快速入门:从路由到自定义 Filter 的完整教程》​

1.网关介绍 在前面的学习中&#xff0c;我们通过Eureka和Nacos解决了辅助注册&#xff0c;使用Spring Cloud LoadBalance解决了负载均衡的问题&#xff0c;使用OpenFeign解决了远程调用的问题。 但是当前的所有微服务的接口都是直接对外暴露的&#xff0c;外部是可以直接访问…

高并发抽奖系统优化方案

引子 最近接触了一个抽奖的项目&#xff0c;由于用户量比较大&#xff0c;而且第三方提供的认证接口并发量有限&#xff0c;为了保证服务的高可用性&#xff0c;所以对高并限制发有一定的要求。经过一系列研究和讨论&#xff0c;做出了以下一些优化方案。 需求分析 根据用户量…

【Doris基础】Apache Doris中的Segment详解:存储与查询的核心组件

目录 1 Segment概述 1.1 什么是Segment 1.2 Segment的重要性 2 Segment的物理结构 2.1 Segment文件组成 2.2 列数据存储格式 3 Segment的生命周期 3.1 Segment创建 3.2 Segment合并(Compaction) 3.3 Segment过期与清理 4 Segment与查询处理 4.1 查询中的Segment剪枝…

JAVA中的枚举

代码示例 理论 枚举的行为多态 public enum MyLockStrategy {SKIP_FAST(){Overridepublic boolean tryLock(RLock lock, MyLock prop) throws InterruptedException {return lock.tryLock(0, prop.leaseTime(), prop.unit());}},FAIL_AFTER_RETRY_TIMEOUT(){Overridepublic bo…

电脑驱动程序更新工具, 3DP Chip 中文绿色版,一键更新驱动!

介绍 3DP Chip 是一款免费的驱动程序更新工具&#xff0c;可以帮助用户快速、方便地识别和更新计算机硬件驱动程序。 驱动程序更新工具下载 https://pan.quark.cn/s/98895d47f57c 软件截图 软件特点 简单易用&#xff1a;用户界面简洁明了&#xff0c;操作方便&#xff0c;…

day61—DFS—省份数量(LeetCode-547)

题目描述 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市&#xff0c;组内不含其他没有相连的城市…

MySql(十)

目录 准备工作 1&#xff09;准备一张表 2&#xff09;插入数据 1.排序 1--asc 升序 2--desc 降序 3--组合排序 2.聚合函数 1.count(字段名) 2.sum(字段名) 3.max(字段名) 4.min(字段名) 5.avg(字段名) 准备工作 1&#xff09;准备一张表 CREATE table role(roleid INT PRIMAR…

LabVIEW Val (Sgnl) 属性

在 LabVIEW 事件驱动架构中&#xff0c;Val (Sgnl) 属性&#xff08;Value (Signaling)&#xff09;是实现编程触发与用户交互行为一致性的关键技术。与普通 Value 属性不同&#xff0c;Val (Sgnl) 在修改控件值的同时强制生成值改变事件&#xff0c;确保程序逻辑与 UI 交互保持…

解常微分方程组

Euler法 function euler_method % 参数设置 v_missile 450; % 导弹速度 km/h v_enemy 90; % 敌艇速度 km/h % 初始条件 x0 0; % 导弹初始位置 x y0 0; % 导弹初始位置 y xe0 120; % 敌艇初始位置 y t0 0; % 初始时间 % 时间步长和总时间 dt 0.01; % 时间步长 t_final …

「Java教案」数据类型、变量与常量

课程目标 1&#xff0e;知识目标 能够根据Java基本数据类型的分类、存储规则及适用场景&#xff0c;合理的选择数据类型。能在合适的场景下正确声明和定义变量和常量。能够根据显式和隐式数据类型转换的规则与风险&#xff0c;合理的进行数据类型转换。 2&#xff0e;能力目…

本地部署基于 Kibana 开源搜索引擎 Elasticsearch 并实现外部访问

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。Kibana 是一个开源可视化工具&#xff0c;用于与 Elasticsearch 进行集成&#xff0c;提供大量数据分析。 本文将详细的介绍如何利用 Docker 在本地部署…

【Ollama】windows部署ollama并运行模型

一、Ollama安装 1.下载Ollama 官网&#xff1a;https://ollama.com/ 2.安装 点击下载 安装完成后打开cmd窗口 键盘按住WinR输入cmd 3.Ollama常用指令 指令说明ollama list查看本地已下载的模型列表ollama pull <模型名>下载模型&#xff08;如 ollama pull llama…

Linux入门(十二)服务管理

服务本质就是进程&#xff0c;但是在后台运行&#xff0c;通常会监听某个端口&#xff0c;等等其他的程序来访问 systemctl 管理指令 systemctl [start | stop | restart | reload | status ] systemctl status NetworkManagersystemctl 服务是在/usr/lib/systemd/system 查看 …