使用 python tkinter 和 pygame 播放 mp3

问题描述

这方面的新手。尝试创建一个输入 mp3 文件路径的 tkinter GUI,按下播放按钮开始播放,按下停止按钮停止播放。使用下面的代码,mp3 播放正常。然而,停止按钮完全没有反应,mp3 继续播放。任何有用的建议都将是 非常感谢。

import tkinter as tk
from pygame import mixer,time

class PlayMusic:
    def __init__(self):
        self.win=tk.Tk()
        self.win.geometry('500x100+600+400')
        self.win.title("Teo's Music Player")

        myfont=('Arial',14,'bold')
        self.lbl=tk.Label(self.win,text='Enter path',font=myfont)
        self.lbl.grid(row=0,column=0)
        self.ent=tk.Entry(self.win,width=25)
        self.ent.grid(row=0,column=1)

        self.b_start=tk.Button(self.win,text='Start >',command=self.start)
        self.b_start.grid(row=1,column=0)
        self.b_stop=tk.Button(self.win,text='Stop |',command=self.stop)
        self.b_stop.grid(row=1,column=1)

        self.win.mainloop()

    def start(self):
        path = str(self.ent.get())
        mixer.init()
        mixer.music.set_volume(0.2)
        mixer.music.load(path)
        mixer.music.play()
        while mixer.music.get_busy():
            time.Clock().tick(1)

    def stop(self):
        mixer.music.stop()


PlayMusic()

解决方法

只需从 while 方法中删除 stop 循环:

def start(self):
    path = str(self.ent.get())
    mixer.init()
    mixer.music.set_volume(0.2)
    mixer.music.load(path)
    mixer.music.play()
    
    # DELETE
    # while mixer.music.get_busy():
    #     time.Clock().tick(1)

在播放音乐时此循环不会终止并阻止应用程序响应。
您只需要在原生 Pygame 应用程序中使用这样一个循环来防止应用程序立即退出(参见 How can I play an mp3 with pygame?how to play wav file in python?)。