【python】tkinter实现音乐播放器(源码+音频文件)【独一无二】


👉博__主👈:米码收割机

👉技__能👈:C++/Python语言

👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。


【python】tkinter实现音乐播放器(源码+音频文件)【独一无二】

目录


一、设计要求

设计要求

本音乐播放器基于 Python + Tkinter + Pygame 开发,旨在提供一个简洁易用的本地音乐播放工具。其设计要求如下:

  1. 基本功能

    • 支持 MP3、WAV、OGG 格式的音频文件播放。
    • 提供 播放、暂停/恢复、停止 控制,确保用户可灵活操作音乐播放状态。
    • 允许用户 批量添加音频文件 ,并在 播放列表 中展示文件名。
  2. 用户交互

    • 使用 Tkinter 图形界面 进行交互,包含按钮、列表框、进度条等组件。
    • 播放时 自动更新进度条,直观显示音乐播放进度。
    • 通过 滑块调节音量,支持音量的动态控制。
  3. 技术要求

    • 采用 Pygame 实现音频解码与播放,确保播放稳定性。
    • 使用 多线程更新进度条,避免 UI 界面卡顿,提高用户体验。
    • 采用 事件驱动模型,保证按钮与控件的高效交互。

二、设计思路

1. 代码功能概述

该代码实现了一个基于 Tkinterpygame 的简易音乐播放器,具备以下功能:

  • 添加音乐文件 :支持用户从本地选择音频文件(mp3wavogg)。
  • 播放控制 :包含 播放暂停/恢复停止 按钮,能够控制音频的播放状态。
  • 音量调节 :通过 Scale 控件调节音乐音量。
  • 播放进度条 :使用 ttk.Progressbar 显示音乐的播放进度,并通过 threading 线程异步更新进度条。

2. 代码核心设计

(1)类 MusicPlayer 的初始化
python 复制代码
class MusicPlayer:
    def __init__(self, root):
        self.root = root
        self.root.title("音乐播放器")
        self.root.geometry("500x350")

        # 初始化pygame的音频引擎
        pygame.mixer.init()
  • 该类 管理播放器的所有功能 ,初始化时:
    • 创建 Tkinter 窗口,设置标题和大小。
    • 初始化 pygame.mixer 用于播放音频。

(2)创建 UI 控件
python 复制代码
# 添加文件按钮
btn_add = tk.Button(self.root, text="添加文件", command=self.add_files)
btn_add.pack(pady=5)

# 部分代码略...

btn_play = tk.Button(frame_controls, text="播放", command=self.play_music)
btn_play.grid(row=0, column=0, padx=5)

btn_pause = tk.Button(frame_controls, text="暂停/恢复", command=self.pause_music)
btn_pause.grid(row=0, column=1, padx=5)

btn_stop = tk.Button(frame_controls, text="停止", command=self.stop_music)
btn_stop.grid(row=0, column=2, padx=5)
  • 播放列表(Listbox 用于显示用户选择的音频文件名。
  • 播放控制按钮
    • 播放 按钮 → play_music() 方法
    • 暂停/恢复 按钮 → pause_music() 方法
    • 停止 按钮 → stop_music() 方法

(3)添加音频文件
python 复制代码
def add_files(self):
    filetypes = [("音频文件", "*.mp3 *.wav *.ogg")]
    new_files = filedialog.askopenfilenames(title="选择音频文件", filetypes=filetypes)
    for f in new_files:
        if f not in self.playlist:
            self.playlist.append(f)
            self.listbox.insert(tk.END, os.path.basename(f))
  • 通过 filedialog.askopenfilenames() 让用户 选择多个音频文件 ,并添加到 playlist 列表中。
  • os.path.basename(f) 提取文件名,避免显示完整路径。

(4)播放音乐
python 复制代码
def play_music(self):
    if not self.playlist:
        return  # 播放列表为空,直接返回

    selection = self.listbox.curselection()
    if selection:
        index = selection[0]
    else:
        # 部分代码略...

        # 部分代码略...

        # 开启更新进度条的线程
        t = threading.Thread(target=self.update_progress, daemon=True)
        t.start()
  • 选取要播放的歌曲
    • 若有选中,则播放选中的。
    • 若无选中,默认播放 playlist[0]
  • 使用 pygame.mixer.music.load() 加载音频文件play() 播放。
  • 进度条更新 采用 多线程,避免主线程阻塞。

(5)暂停/恢复音乐
python 复制代码
def pause_music(self):
    if self.is_stopped or self.current_index is None:
        return
    if not self.is_paused:
        pygame.mixer.music.pause()
        self.is_paused = True
    else:
        pygame.mixer.music.unpause()
        self.is_paused = False
  • 暂停 :调用 pygame.mixer.music.pause()
  • 恢复 :调用 pygame.mixer.music.unpause()

(6)停止音乐
python 复制代码
def stop_music(self):
    pygame.mixer.music.stop()
    self.is_stopped = True
    self.is_paused = False
    self.progress['value'] = 0
  • pygame.mixer.music.stop() 停止播放,并重置进度条。

(7)进度条更新
python 复制代码
def update_progress(self):
    sound = pygame.mixer.Sound(self.playlist[self.current_index])
    total_length = sound.get_length()  # 获取音频总时长(秒)

    start_time = time.time()
    while not self.is_stopped and not self.is_paused:
        if not pygame.mixer.music.get_busy():
            break  # 播放结束

        # 部分代码略...

        self.progress['value'] = progress_percent
        self.root.update_idletasks()
        time.sleep(0.2)  # 200ms 刷新一次

    self.progress['value'] = 0
  • 通过 pygame.mixer.Sound().get_length() 获取音乐总时长
  • 线程循环 更新 Progressbar 进度:
    • pygame.mixer.music.get_busy() 判断播放状态。
    • 计算已播放时长,并按比例更新进度条。

(8)调整音量
python 复制代码
def set_volume(self, val):
    volume = float(val)
    pygame.mixer.music.set_volume(volume)
  • 通过 pygame.mixer.music.set_volume() 调整播放音量 (取值 0~1)。

3. 代码结构总结

功能 代码方法 说明
添加文件 add_files() 选择音频文件,并加入播放列表
播放音乐 play_music() 选择并播放音乐,启动进度条线程
暂停/恢复 pause_music() 切换播放/暂停状态
停止音乐 stop_music() 停止播放,并重置进度条
更新进度条 update_progress() 计算播放进度,更新 Progressbar
音量调节 set_volume() 通过 Scale 控件调整音量

4. 总结

  • Tkinter 负责 UI 交互ButtonListboxScale 控件。
  • pygame 负责音频播放mixer.music.load() 加载文件,play() 开始播放。
  • 线程控制进度条,避免 UI 阻塞,提高流畅度。

三、可视化分析




相关推荐
_extraordinary_4 分钟前
Java 栈和队列
java·开发语言
永远孤独的菜鸟11 分钟前
# 全国职业院校技能大赛中职组“网络建设与运维“赛项项目方案
python
mit6.82432 分钟前
[Meetily后端框架] 多模型-Pydantic AI 代理-统一抽象 | SQLite管理
c++·人工智能·后端·python
一眼万里*e37 分钟前
Python 字典 (Dictionary) 详解
前端·数据库·python
wjs20241 小时前
Django ORM - 多表实例
开发语言
Joker—H1 小时前
【Java】JUC并发(线程的方法、多线程的同步并发)
java·开发语言·经验分享·idea
_kaika11 小时前
使用 1Panel PHP 运行环境部署 WordPress
开发语言·php
isNotNullX1 小时前
数据怎么分层?从ODS、DW、ADS三大层一一拆解!
大数据·开发语言·数据仓库·分布式·spark
wuyoula2 小时前
deepseekAI对接大模型的网页PHP源码带管理后台(可实现上传分析文件)
开发语言·php
mortimer2 小时前
Python 正则替换陷阱:`\1` 为何变成了 `\x01`?
python·正则表达式