Python開發(fā)簡易音樂播放器的示例詳解
開發(fā)環(huán)境準(zhǔn)備-音樂獲取
從酷狗音樂中單個(gè)獲取,需要先登錄

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',
}
# 獲取內(nèi)容
response = requests.get('https://wwwapi.kugou.com/play/songinfo', params=params, headers=headers).text
data = json.loads(response) # 轉(zhuǎn)換成json格式
res = requests.get(data['data']['play_url'], headers=headers) # 再次發(fā)起請(qǐng)求,獲取音樂
# 標(biāo)題
title = data['data']['audio_name']
with open(f'{title}.mp3', 'wb') as f:
f.write(res.content)
print("下載完成")
f.close()
那么單個(gè)音樂就下載好了菲菲公主(陸綺菲) - 第57次取消發(fā)送.mp3
核心功能概述
音樂文件選擇:允許用戶從文件系統(tǒng)中選擇音樂文件
播放控制:播放、暫停、停止、調(diào)整音量
播放列表管理:添加、刪除、顯示音樂文件
界面顯示:簡潔的圖形用戶界面
代碼實(shí)現(xiàn)與知識(shí)點(diǎn)解析
1. 導(dǎo)入必要的庫
import pygame import tkinter as tk from tkinter import filedialog, messagebox import os import time from threading import Thread
知識(shí)點(diǎn):
- pygame:Python游戲開發(fā)庫,提供音頻處理功能
- tkinter:Python標(biāo)準(zhǔn)GUI庫,用于創(chuàng)建圖形界面
- os:操作系統(tǒng)接口,用于文件路徑處理
- threading:線程管理,用于后臺(tái)播放音樂
2. 初始化pygame和音頻系統(tǒng)
# 初始化pygame pygame.init() # 初始化音頻系統(tǒng) pygame.mixer.init()
知識(shí)點(diǎn):
- pygame.init():初始化所有pygame模塊
- pygame.mixer.init():初始化音頻系統(tǒng),為音樂播放做準(zhǔn)備
3. 創(chuàng)建音樂播放器類
class MusicPlayer:
def __init__(self, root):
self.root = root
self.root.title("Python簡易音樂播放器")
self.root.geometry("500x400")
self.root.resizable(False, False)
self.root.configure(bg="#f0f0f0")
# 音樂播放狀態(tài)
self.is_playing = False
self.current_track = None
self.playlist = []
# 創(chuàng)建界面
self.create_ui()
# 更新播放狀態(tài)的線程
self.update_thread = Thread(target=self.update_play_state)
self.update_thread.daemon = True
self.update_thread.start()
知識(shí)點(diǎn):
- 類的定義與初始化:面向?qū)ο缶幊?/li>
- GUI窗口配置:設(shè)置標(biāo)題、大小、背景色
- 線程使用:創(chuàng)建后臺(tái)線程監(jiān)控播放狀態(tài)
4. 創(chuàng)建用戶界面
def create_ui(self):
# 標(biāo)題標(biāo)簽
self.title_label = tk.Label(self.root, text="Python簡易音樂播放器", font=("Arial", 16), bg="#f0f0f0")
self.title_label.pack(pady=10)
# 當(dāng)前播放標(biāo)簽
self.current_label = tk.Label(self.root, text="當(dāng)前未播放任何音樂", 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) # 默認(rèn)音量70%
self.volume_scale.grid(row=0, column=1, padx=5)
# 設(shè)置初始音量
pygame.mixer.music.set_volume(0.7)
# 雙擊播放
self.playlist_box.bind("<Double-1>", self.play_selected)知識(shí)點(diǎn):
- 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 = None
except IndexError:
messagebox.showinfo("提示", "請(qǐng)先選擇要?jiǎng)h除的音樂")
def play_selected(self, event=None):
"""播放選中的音樂"""
try:
selected_index = self.playlist_box.curselection()[0]
self.play_music(selected_index)
except IndexError:
messagebox.showinfo("提示", "請(qǐng)先選擇要播放的音樂")
def play_music(self, index=None):
"""播放音樂"""
if not self.playlist:
messagebox.showinfo("提示", "播放列表為空,請(qǐng)先添加音樂")
return
# 如果指定了索引,則播放指定音樂
if index is not None:
self.current_track = index
# 否則,如果當(dāng)前沒有播放,則播放選中的或第一首
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
# 更新當(dāng)前播放標(biāo)簽
current_file = os.path.basename(self.playlist[self.current_track])
self.current_label.config(text=f"當(dāng)前播放: {current_file}")
# 高亮顯示當(dāng)前播放的曲目
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("錯(cuò)誤", "無法播放所選音樂文件")
self.current_track = None
def pause_music(self):
"""暫停/恢復(fù)音樂播放"""
if self.is_playing:
pygame.mixer.music.pause()
self.is_playing = False
self.pause_button.config(text="恢復(fù)")
else:
pygame.mixer.music.unpause()
self.is_playing = True
self.pause_button.config(text="暫停")
def stop_music(self):
"""停止音樂播放"""
pygame.mixer.music.stop()
self.is_playing = False
self.current_label.config(text="當(dāng)前未播放任何音樂")
self.pause_button.config(text="暫停")
def set_volume(self, val):
"""設(shè)置音量"""
volume = float(val) / 100
pygame.mixer.music.set_volume(volume)
def update_play_state(self):
"""更新播放狀態(tài)(在后臺(tái)線程中運(yùn)行)"""
while True:
if self.is_playing and not pygame.mixer.music.get_busy():
# 當(dāng)前歌曲播放完畢,播放下一首
self.root.after(100, self.play_next)
time.sleep(0.1)
def play_next(self):
"""播放下一首音樂"""
if not self.playlist:
return
if self.current_track is not None and self.current_track < len(self.playlist) - 1:
self.current_track += 1
self.play_music(self.current_track)
else:
# 播放列表結(jié)束,停止播放
self.stop_music()
self.current_track = None
知識(shí)點(diǎn):
- 文件對(duì)話框:使用filedialog選擇音樂文件
- 音樂控制:使用pygame.mixer.music控制音樂播放
- 異常處理:使用try/except處理可能的錯(cuò)誤
- 線程同步:使用after方法在主線程中執(zhí)行函數(shù)
- 事件驅(qū)動(dòng)編程:基于用戶操作觸發(fā)相應(yīng)功能
6. 主程序入口
def main():
# 創(chuàng)建主窗口
root = tk.Tk()
# 創(chuàng)建音樂播放器實(shí)例
app = MusicPlayer(root)
# 運(yùn)行主循環(huán)
root.mainloop()
# 退出時(shí)清理資源
pygame.mixer.quit()
pygame.quit()
if __name__ == "__main__":
main()
效果圖
從中添加音樂,就可以直接播放了,當(dāng)然,可以打包成一個(gè)自己的播放器

總結(jié)
通過這個(gè)簡易音樂播放器項(xiàng)目,我們學(xué)習(xí)了以下Python編程知識(shí):
- pygame庫的音頻處理功能
- tkinter GUI編程
- 多線程編程
- 事件驅(qū)動(dòng)編程模型
- 文件操作和路徑處理
- 面向?qū)ο缶幊趟枷?/li>
- 異常處理
到此這篇關(guān)于Python開發(fā)簡易音樂播放器的示例詳解的文章就介紹到這了,更多相關(guān)Python音樂播放器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 實(shí)現(xiàn)將大圖切片成小圖,將小圖組合成大圖的例子
這篇文章主要介紹了Python 實(shí)現(xiàn)將大圖切片成小圖,將小圖組合成大圖的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
詳解Python3之?dāng)?shù)據(jù)指紋MD5校驗(yàn)與對(duì)比
這篇文章主要介紹了Python3之?dāng)?shù)據(jù)指紋MD5校驗(yàn)與對(duì)比,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
tensorflow tf.train.batch之?dāng)?shù)據(jù)批量讀取方式
今天小編就為大家分享一篇tensorflow tf.train.batch之?dāng)?shù)據(jù)批量讀取方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01
如何用scheduler實(shí)現(xiàn)learning-rate學(xué)習(xí)率動(dòng)態(tài)變化
這篇文章主要介紹了如何用scheduler實(shí)現(xiàn)learning-rate學(xué)習(xí)率動(dòng)態(tài)變化問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
tensorflow如何繼續(xù)訓(xùn)練之前保存的模型實(shí)例
今天小編就為大家分享一篇tensorflow如何繼續(xù)訓(xùn)練之前保存的模型實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01
解決Django Static內(nèi)容不能加載顯示的問題
今天小編就為大家分享一篇解決Django Static內(nèi)容不能加載顯示的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07
python opencv實(shí)現(xiàn)簡易畫圖板
這篇文章主要為大家詳細(xì)介紹了python opencv實(shí)現(xiàn)簡易畫圖板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08

