我正在使用Python3和Tkinter制作一个mp3播放器,使用pygame.mixer制作mp3。当您输入目录并按play时,它会自动查找目录中的所有MP3(使用glob),并将它们添加到列表中。我使用for循环加载然后播放音乐,但是当它播放时,它会立即开始下一首歌,并自动重复,直到列表的末尾,它只播放那首歌。我尝试使用time.sleep(),它可以工作,但会冻结程序。我怎么能等到歌曲结束后再开始下一首而不冻结节目呢
我当前的代码(仅用于播放音乐的功能):
def play():
print("playing")
global playing
playing = True
direct = directorye.get()
direct = direct.lower()
if direct.endswith(".mp3"):
mixer.music.load(directorye.get())
mixer.music.play()
else:
dire = r"C:\Users\agweb\Downloads\Music" #for the time being I just hard coded the directory
mp3s = glob.glob(dire + r"\*.MP3") # adds all MP3s in directory to list
#mp3s =+ glob.glob(directorye.get() + "*.MP3")
for i in mp3s:
print(i)
mixer.music.load(i)
mixer.music.play()
audio = MP3(i)
time.sleep(audio.info.length) #works but freezes program
这个解决方案可以工作,您可以测试它
有几种可能的方法
因为
tkinter
在Python3上是线程安全的(*),所以最简单的方法可能是启动稍微修改过的play
函数作为第二个线程在全局上下文中,创建一个
threading.Event
。我建议用stop_playing
这个名字在play(播放)功能中,一次仅睡眠一小段时间,检查是否设置了
stop_playing
:“Play”按钮的新回调应该为
play()
和start()
它创建一个线程“停止”按钮的回调应该只调用
stop_playing.set()
。这将导致播放线程停止(*前提是它使用已启用线程的
tcl
编译。)相关问题 更多 >
编程相关推荐