You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pygame和Mutagen实现Tkinter进度条随歌曲进度更新

Tkinter音频进度条实时更新实现方案

核心思路

  • 选用支持获取播放进度的音频库(比如pygame.mixer),替代无进度反馈的简单播放库
  • 利用Tkinter的after()方法定时查询当前播放位置,同步更新进度条

完整示例代码

import tkinter as tk
from tkinter import ttk, filedialog
import pygame
from mutagen.mp3 import MP3
from mutagen.wave import WAVE

def select_song():
    global current_song
    current_song = filedialog.askopenfilename(filetypes=[("音频文件", "*.mp3 *.wav")])
    if current_song:
        song_label.config(text=current_song.split("/")[-1])

def get_total_length():
    if not current_song:
        return 0
    # 根据文件类型获取准确时长
    if current_song.endswith(".mp3"):
        audio = MP3(current_song)
        return audio.info.length
    elif current_song.endswith(".wav"):
        audio = WAVE(current_song)
        return audio.info.length
    return 0

def play_song():
    if not current_song:
        return
    pygame.mixer.music.load(current_song)
    pygame.mixer.music.play()
    update_progress()

def update_progress():
    if pygame.mixer.music.get_busy():
        total_length = get_total_length()
        if total_length <= 0:
            root.after(100, update_progress)
            return
        # 获取当前播放位置(转成秒)
        current_pos = pygame.mixer.music.get_pos() / 1000
        # 更新进度条百分比
        progress_bar['value'] = (current_pos / total_length) * 100
        # 100毫秒后再次触发更新
        root.after(100, update_progress)
    else:
        # 播放结束重置进度条
        progress_bar['value'] = 0

# 初始化pygame音频模块
pygame.mixer.init()

# 创建主窗口
root = tk.Tk()
root.title("简易音频播放器")
root.geometry("400x200")

current_song = ""

# 组件布局
song_label = ttk.Label(root, text="未选择歌曲")
song_label.pack(pady=10)

select_btn = ttk.Button(root, text="选择歌曲", command=select_song)
select_btn.pack(pady=5)

play_btn = ttk.Button(root, text="播放", command=play_song)
play_btn.pack(pady=5)

progress_bar = ttk.Progressbar(root, orient="horizontal", length=300, mode="determinate")
progress_bar.pack(pady=10)

root.mainloop()

关键细节说明

  • pygame.mixer.music.get_busy(): 判断音频是否处于播放状态,以此决定是否继续更新进度
  • pygame.mixer.music.get_pos(): 获取当前播放的毫秒位置,转成秒后用于计算进度比例
  • mutagen库: 用来精准获取音频总时长,比pygame自带的方法兼容性更好,支持mp3、wav等格式
  • root.after(100, update_progress): 每隔100毫秒触发一次进度更新,避免阻塞Tkinter主循环导致界面假死

前置准备

先安装依赖库:

pip install pygame mutagen

内容的提问来源于stack exchange,提问作者ZliBajlma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:25:08