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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83111.shtml
英文地址,請注明出處:http://en.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…