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

📚 前言

编程基础第一期《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.pswp.cn/pingmian/83111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssh连接断开,保持任务后台执行——tmux

目录 **核心用途****基础使用方法**1. **安装 tmux**2. **启动新会话**3. **常用快捷键&#xff08;需先按 Ctrlb 前缀&#xff09;**4. **会话管理命令**5. **窗格操作进阶** **典型工作流****注意事项****配置文件&#xff08;~/.tmux.conf&#xff09;** tmux&#xff08; …

3D Gaussian splatting 04: 代码阅读-提取相机位姿和稀疏点云

目录 3D Gaussian splatting 01: 环境搭建3D Gaussian splatting 02: 快速评估3D Gaussian splatting 03: 用户数据训练和结果查看3D Gaussian splatting 04: 代码阅读-提取相机位姿和稀疏点云3D Gaussian splatting 05: 代码阅读-训练整体流程3D Gaussian splatting 06: 代码…

每日c/c++题 备战蓝桥杯(P1204 [USACO1.2] 挤牛奶 Milking Cows)

P1204 [USACO1.2] 挤牛奶 Milking Cows - 详解与代码实现 一、题目背景 三个农民每天清晨[……]&#xff08;简要介绍题目背景&#xff0c;与官网描述类似&#xff09; 二、问题分析 输入要求 &#xff1a;读取 N 个农民的挤奶时间区间&#xff0c;计算两个值&#xff1a;最…

保持本地 Git 项目副本与远程仓库完全同步

核心目标&#xff1a; 保持本地 Git 项目副本与 GitHub 远程仓库完全同步。 关键方法&#xff1a; 定期执行 git pull 命令。 操作步骤&#xff1a; 进入项目目录&#xff1a; 在终端/命令行中&#xff0c;使用 cd 命令切换到你的项目文件夹。执行拉取命令&#xff1a; 运行…

Flutter 4.x 版本 webview_flutter 嵌套H5

踩坑早期版本 使用 WebView 代码如下 import package:flutter/material.dart; import package:webview_flutter/webview_flutter.dart;class HomePage extends StatelessWidget {const HomePage({super.key});overrideWidget build(BuildContext context) {return Scaffold(ap…

rtpinsertsound:语音注入攻击!全参数详细教程!Kali Linux教程!

简介 2006年8月至9月期间&#xff0c;我们创建了一个用于将音频插入指定音频&#xff08;即RTP&#xff09;流的工具。该工具名为rtpinsertsound。 该工具已在Linux Red Hat Fedora Core 4平台&#xff08;奔腾IV&#xff0c;2.5 GHz&#xff09;上进行了测试&#xff0c;但预…

跑步前热身动作

跑前热身的核心目标是升高体温、激活肌肉、预防损伤 &#xff0c;同时通过动态动作提升运动表现。热身&#xff08;步骤关节→肌肉→心肺&#xff09;和针对性动作&#xff08;如抱膝抬腿&#xff09;能有效降低受伤风险&#xff0c;建议每次跑步前严格执行。 推荐跑前热身动作…

GIT命令行的一些常规操作

放弃修改 git checkout . 修改commit信息 git commit --amend 撤销上次本地commit 1、通过git log查看上次提交的哈希值 2、git reset --soft 哈希值 分支 1.创建本地分支 git branch 分支名 2.切换本地分支 git checkout mybranch&#xff1b; 3.创建一个新分支并…

RAGFlow从理论到实战的检索增强生成指南

目录 前言 一、RAGFlow是什么&#xff1f;为何需要它&#xff1f; 二、RAGFlow技术架构拆解 三、实战指南&#xff1a;从0到1搭建RAGFlow系统 步骤1&#xff1a;环境准备 步骤2&#xff1a;数据接入 步骤3&#xff1a;检索与生成 四、优化技巧&#xff1a;让RAGFlow更精…

软件工程方法论:在确定性与不确定性的永恒之舞中寻找平衡

当我们谈论“软件工程”时&#xff0c;“工程”二字总暗示着某种如桥梁建造般的精确与可控。然而&#xff0c;软件的本质却根植于人类思维的复杂性与需求的流变之中。软件工程方法论的发展史&#xff0c;并非线性进步的凯歌&#xff0c;而是一部在确定性的渴望与不确定性的现实…

Python打卡训练营Day41

DAY 41 简单CNN 知识回顾 数据增强卷积神经网络定义的写法batch归一化&#xff1a;调整一个批次的分布&#xff0c;常用与图像数据特征图&#xff1a;只有卷积操作输出的才叫特征图调度器&#xff1a;直接修改基础学习率 卷积操作常见流程如下&#xff1a; 1. 输入 → 卷积层 →…

开源版 PyMOL 如何绘制 Galidesivir 分子结构 ?

参阅&#xff1a;开源版PyMol安装保姆级教程 百度网盘下载 提取码&#xff1a;csub pip show pymol 简介: PyMOL是一个Python增强的分子图形工具。它擅长蛋白质、小分子、密度、表面和轨迹的3D可视化。它还包括分子编辑、射线追踪和动画。 先从 www.python.org 下载 python-…

【FPGA】Vivado 保姆级安装教程 | 从官网下载安装包开始到安装完毕 | 每步都有详细截图说明 | 支持无脑跟装

安装包下载&#xff1a;Xilinx_Vivado Download Link&#xff08;下好后可直接安装&#xff09; 目录 &#xff08;有安装包后&#xff0c;可直接跳转至 Step5&#xff0c;免得去官网下了&#xff0c;比较麻烦&#xff09; Step1&#xff1a;进入官网 Step2&#xff1a;注册…

纯html,js创建一个类似excel的表格

后台是php,表中数据可编辑,可删除,可提交到数据库 <!DOCTYPE html> <html> <head><meta charset="utf-8"><style>body {font-family: Arial, sans-serif;margin: 20px;background-color: #fff;}.toolbar {margin-bottom: 10px;disp…

密码编码器使用指南

密码编码器概述 通过第三章的学习,您应该已经对UserDetails接口及其多种实现方式有了清晰认识。如第二章所述,在认证授权流程中,不同参与者负责管理用户凭证的表示形式,其中UserDetailsService和PasswordEncoder等组件都提供了默认实现。本节将重点分析PasswordEncoder的核…

《数据结构初阶》【番外篇:二路归并的外排史诗】

【番外篇&#xff1a;多路归并的外排史诗】目录 前言&#xff1a;---------------介绍---------------一、实际情景二、外部排序什么是外部排序&#xff1f; 三、多路归并排序什么是多路归并排序&#xff1f; ---------------实现---------------四、文件归并文件二路归并排序思…

DDP与FSDP:分布式训练技术全解析

DDP与FSDP:分布式训练技术全解析 DDP(Distributed Data Parallel)和 FSDP(Fully Sharded Data Parallel)均为用于深度学习模型训练的分布式训练技术,二者借助多 GPU 或多节点来提升训练速度。 1. DDP(Distributed Data Parallel) 实现原理 数据并行:把相同的模型复…

MATLAB实战:实现数字调制解调仿真

以下是使用MATLAB实现BPSK和QPSK数字调制解调仿真的完整代码。该代码包括调制、AWGN信道、匹配滤波/相关解调、星座图绘制以及误码率计算与理论值比较。 %% 清理环境 clear all; close all; clc; %% 参数设置 numBits 100000; % 传输比特数 EbN0_dB 0:2:10; …

数据可视化的定义和类型

数据可视化是一种将数据转换为图形或视觉表示的方法。想象一下&#xff0c;你面前有一堆数字和表格&#xff0c;看着这些&#xff0c;可能会让人头大。数据可视化就像是给这些枯燥的数字画上一幅画。它用图表、地图和各种有趣的图形&#xff0c;帮我们把难懂的数字变得容易看懂…

*JavaScript中的Symbol类型:唯一标识符的艺术

JavaScript中的Symbol类型&#xff1a;唯一标识符的艺术 在JavaScript的世界中&#xff0c;数据类型一直是开发者关注的焦点。从基本的Number、String到后来的Symbol&#xff0c;每一种类型的引入都为语言本身注入了新的活力。而今天我们要聊的主角——Symbol&#xff0c;是ES…