Python Progressbar显示播放的音乐量

Python Progressbar显示播放的音乐量,python,python-2.7,tkinter,Python,Python 2.7,Tkinter,假设我使用mp3play模块播放mp3文件,并使用ttk.Progressbar,我想显示播放的音乐量(持续时间)。有什么代码可以实现吗 我还想要一个计时器来显示播放音乐的持续时间 import ttk import mp3play self.music = mp3play.load('filename') self.fr=ttk.Frame() self.fr.pack(expand=True, fill=BOTH, side=TOP) self.seek=ttk.Progressbar(se

假设我使用
mp3play
模块播放mp3文件,并使用
ttk.Progressbar
,我想显示播放的音乐量(持续时间)。有什么代码可以实现吗

我还想要一个计时器来显示播放音乐的持续时间

import ttk
import mp3play
self.music = mp3play.load('filename')
self.fr=ttk.Frame()
self.fr.pack(expand=True, fill=BOTH, side=TOP)
self.seek=ttk.Progressbar(self.fr, orient='horizontal', mode='determinate', length=500)
self.seek.place(x=50, y=325)
self.seek.start()

查看
mp3play
模块的代码,
mp3play.load()
返回一个
AudioClip
对象。此对象具有方法
seconds()
millizes()
,分别以秒或毫秒为单位提供剪辑长度

您可以在开始播放时保存时间,并将其与当前时间和剪辑的总长度进行比较,以确定进度条的状态

# assuming time would me measured in milliseconds
start = time()
while playing:
    # progress measured in percentages
    progress = 100 * (time() - start)/ clip.milliseconds()

mp3play模块似乎已安装到Windows库中。具体来说,它使用的功能是多媒体系统

实现所需功能的一个选项是使用命令定期检索当前播放位置,并根据需要显示它

从mp3play库中修改
AudioClip
类的两个版本似乎最合适


修改mp3play库 在windows.py中为AudioClip初始化 首先,您可以在线看到一个使用status命令的函数

    def _mode(self):
        err, buf = self._mci.directsend('status %s mode' % self._alias)
        return buf
我们可以基于此示例编写一个新函数,它将获得当前播放位置:

    def current_position(self):
        err, buf = self._mci.directsend('status %s position' % self._alias)
        return buf
此函数将返回一个字符串,该字符串编码一个以毫秒为单位表示当前位置的数字

init.py中对音频剪辑进行分类 下一步是在线修改
AudioClip
类,添加以下功能:

    def current_position(self):
        """Get current position of clip in milliseconds."""
        return int(self._clip.current_position())

CLI示例 现在我们可以用一个简单的脚本来测试它:

import time
import mp3play

clip = mp3play.load(r'test.mp3')

clip.play()

for i in range(5):
    print "Position: %d / %d" % (clip.current_position(), clip.milliseconds())
    time.sleep(1)

clip.stop()
控制台输出如下所示:

>python test.py
Position: 0 / 174392
Position: 905 / 174392
Position: 1906 / 174392
Position: 2906 / 174392
Position: 3907 / 174392

GUI示例 截图:


不工作的人,你能用正确的代码解释我吗?还有一件事,mp3play.load.seconds()返回的持续时间错误,例如,我测试了一个持续时间为4:36分钟的mp3文件,它返回的持续时间为6:29分钟@nysten你能用代码解释我吗?例如,一个文件,以及如何将其合并到进度条中@DanMasek@TigerKing好啊好了。请解释一下“self.music.current_position()”bcoz mp3play没有像current_position()那样的属性@DanMasek@TigerKing您需要修改mp3play库并添加这些函数,如答案的第一部分所述。感谢您的帮助,但仍存在一个错误,你在你的代码中写了一行
label\u text=“%s/%s(%0.2f%%)”%(格式持续时间(pos\u ms)、格式持续时间(total\u ms)、进度百分比)
但是当我把它合并到我的程序中时,python说
全局名称“格式持续时间”没有定义
@DanMasek
import tkinter as tk
from tkinter import ttk

import mp3play

# ================================================================================

def format_duration(ms):
    total_s = ms / 1000
    total_min = total_s / 60
    remain_s = total_s % 60
    return "%0d:%02d" % (total_min, remain_s)

# ================================================================================

class SimplePlayer(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        # Variables we use to dynamically update the text of the labels
        self.music_title = tk.StringVar()
        self.music_progress = tk.StringVar()

        self.fr=ttk.Frame()
        self.fr.pack(expand=True, fill=tk.BOTH, side=tk.TOP)

        # Label to display the song title
        self.title_lbl = ttk.Label(self.fr, textvariable = self.music_title)
        self.title_lbl.pack()

        # Playback progress bar
        self.progress_bar = ttk.Progressbar(self.fr, orient='horizontal', mode='determinate', length=500)
        self.progress_bar.pack()

        # Shows the progress numerically
        self.progress_lbl = ttk.Label(self.fr, textvariable = self.music_progress)
        self.progress_lbl.pack()


    def start(self, music_file):
        self.music = mp3play.load(music_file)

        # Update the title
        self.music_title.set(music_file)

        # Start playback
        self.music.play()

        # Start periodically updating the progress bar and progress label
        self.update_progress()

    def update_progress(self):
        pos_ms = self.music.current_position()
        total_ms = self.music.milliseconds()
        progress_percent = pos_ms / float(total_ms) * 100

        # Update the label
        label_text = "%s / %s   (%0.2f %%)" % (format_duration(pos_ms), format_duration(total_ms), progress_percent)
        self.music_progress.set(label_text)

        # Update the progress bar
        self.progress_bar["value"] = progress_percent

        # Schedule next update in 100ms        
        self.after(100, self.update_progress)

# ================================================================================

app = SimplePlayer()

app.start('test.mp3')
app.mainloop()