如何使用Pygame实现歌曲播放完毕后自动播放下一首
实现Pygame音乐播放器自动切歌的解决方案
嘿,这个需求我之前做类似项目时也碰到过!Pygame的mixer.music模块其实自带了检测播放状态的方法,咱们可以用它来实现歌曲播放完毕后自动切歌的功能。下面我一步步给你拆解修改思路和完整代码:
核心思路
要实现自动切歌,关键在于实时检测当前歌曲是否播放完毕,并在播放结束后加载列表中的下一首歌曲。我们需要:
- 用一个变量追踪当前播放的歌曲索引
- 循环检查播放状态,当歌曲播放完毕时切换到下一首
- 可选处理循环播放(播完最后一首回到第一首)或播放结束停止的逻辑
修改后的完整代码
import tkinter.filedialog as filedialog import os import pygame import time directory = filedialog.askdirectory() os.chdir(directory) # 收集文件夹内所有MP3文件 song_list = [] for file in os.listdir(directory): if file.endswith('.mp3'): song_list.append(file) # 初始化Pygame混音器 pygame.mixer.init() # 追踪当前播放歌曲的索引 current_song_index = 0 def play_next_song(): global current_song_index # 索引自增,用取模实现循环播放(播完最后一首回到第一首) current_song_index = (current_song_index + 1) % len(song_list) pygame.mixer.music.load(song_list[current_song_index]) pygame.mixer.music.play() print(f"正在播放: {song_list[current_song_index]}") # 先播放列表中的第一首歌曲 if song_list: pygame.mixer.music.load(song_list[current_song_index]) pygame.mixer.music.play() print(f"正在播放: {song_list[current_song_index]}") # 循环检测播放状态 while True: # 每隔0.5秒检查一次,避免过度占用CPU time.sleep(0.5) # get_busy()返回False表示当前无歌曲在播放 if not pygame.mixer.music.get_busy(): play_next_song() else: print("选中的文件夹里没有MP3文件哦!")
关键代码解释
pygame.mixer.music.get_busy():这个函数返回布尔值,True表示歌曲正在播放,False表示播放完毕或未开始播放,是检测切歌时机的核心。time.sleep(0.5):避免循环高频运行占用过多CPU资源,0.5秒的间隔完全能及时捕捉播放结束的时机。current_song_index = (current_song_index + 1) % len(song_list):通过取模运算实现循环播放,如果你希望播完最后一首就停止,可以把这部分改成:current_song_index += 1 if current_song_index >= len(song_list): print("所有歌曲播放完毕!") break pygame.mixer.music.load(song_list[current_song_index]) pygame.mixer.music.play()
内容的提问来源于stack exchange,提问作者user9072240




