You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Pygame实现歌曲播放完毕后自动播放下一首

实现Pygame音乐播放器自动切歌的解决方案

嘿,这个需求我之前做类似项目时也碰到过!Pygame的mixer.music模块其实自带了检测播放状态的方法,咱们可以用它来实现歌曲播放完毕后自动切歌的功能。下面我一步步给你拆解修改思路和完整代码:

核心思路

要实现自动切歌,关键在于实时检测当前歌曲是否播放完毕,并在播放结束后加载列表中的下一首歌曲。我们需要:

  1. 用一个变量追踪当前播放的歌曲索引
  2. 循环检查播放状态,当歌曲播放完毕时切换到下一首
  3. 可选处理循环播放(播完最后一首回到第一首)或播放结束停止的逻辑

修改后的完整代码

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

火山引擎 最新活动