我正在尝试创建一个快速的小 GUI,它可以让我播放 mp3 文件、暂停它们、跳到序列中的下一个文件,最重要的是:在最后一个 mp3 文件播放完毕后播放下一个 mp3 文件。
然而,最后一个规定是一个问题,无论我如何尝试,我都无法使其发挥作用。我正在考虑将所有 mp3 文件附加到一个文件中,然后跳过该文件,但如果可以的话,我想这样解决它。
我的问题是:如何测试 mp3 文件是否已播放完毕,以便我可以播放下一个?
这是我的代码:
from pygame import mixer
import os,sys
import tkinter as tk
from tkinter import PhotoImage
#getting song list
song_list = [];
for root, dirs, files in os.walk("/Users/loganjacobs/Desktop/mp3playerFiles"):
for name in files:
song_list.append(os.path.join(root, name))
# Starting the mixer
mixer.init()
# Loading the song
song_count = 0;
mixer.music.load(song_list[song_count])
# Setting the volume
mixer.music.set_volume(0.5)
# Start playing the song
mixer.music.play()
paused = False
def pause():
mixer.music.pause()
def resume():
mixer.music.unpause()
def stop():
mixer.music.stop()
def skip(song_count):
song_count = (song_count + 1) % len(song_list)
mixer.music.load(song_list[song_count])
mixer.music.play()
return song_count
window = tk.Tk()
frame = tk.Frame()
def button_pause():
global paused
paused = not paused
pause() if paused else resume()
pause_button.config(image= play_image if paused else pause_image)
pause_image = PhotoImage(file='imgs/pause_button.png').subsample(4)
play_image = PhotoImage(file='imgs/play_button.png').subsample(4)
pause_button = tk.Button(frame,image=pause_image,command= lambda: button_pause())
pause_button.pack()
def button_skip():
global song_count
global paused
if paused:
button_pause()
song_count = skip(song_count)
skip_image = PhotoImage(file='imgs/skip_button.png').subsample(4)
skip_button = tk.Button(frame,image= skip_image,command= lambda: button_skip())
skip_button.pack()
frame.pack()
window.mainloop()
我尝试使用window.after不断测试mixer.music.get_busy()是否为True,但这似乎不起作用。我尝试使用mixer.music.get_pos(),但这导致了口吃。我也尝试使用 pygame 事件,但我真的不知道如何使用它们,所以我让 chatGPT 尝试一下,但这也不起作用。有任何想法吗?我非常感激。
使用mixer.music.get_busy()或mixer.music.get_pos()来确定歌曲是否已完成播放的问题是它们不提供实时反馈,并且对于您的情况可能不准确。 相反,您可以利用 Pygame 的 music_end 操作来确定歌曲何时完成播放。