You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python双文件开发学习游戏实现后台播放音乐播放列表问题求助

解决方案

问题原因

当前音乐播放逻辑被放在主线程中运行,play()方法内的循环会一直占用主线程资源,只有播放列表全部播放完成后才会执行后续的答题交互代码,因此出现阻塞问题。

修复方法

1. 主程序引入多线程模块(无需修改原音乐播放器代码)

通过Python标准库threading将音乐播放任务放入独立子线程运行,即可实现后台播放不阻塞前台逻辑的效果,修改后的主程序代码如下:

import threading
import Musicplayer

# 创建子线程运行音乐播放逻辑,daemon参数设置为True保证主程序退出时音乐线程同步关闭
music_thread = threading.Thread(target=Musicplayer.play, daemon=True)
music_thread.start()

# 原有答题逻辑不受影响正常执行
ans1 = 2
print('What is 1 + 1?')
userAnswer = input("Your answer:")
# 注意input返回值为字符串,需转成整数再比较,避免输入数字也判定错误
if int(userAnswer) == ans1:
    print('Correct!')
else:
    print('Incorrect.')

2. 音乐播放器代码可选优化

原播放器代码存在两个可优化点,你可以根据需要调整:

  • 播放列表写死且无文件后缀,实际运行时可能因为文件名不匹配加载失败
  • 循环判断歌曲播放状态时无休眠,会造成不必要的CPU占用

优化后的Musicplayer.py代码如下:

# Musicplayer File
import os
import pygame
import random

def play():
    # 自动扫描当前目录下所有常见格式的音频文件生成播放列表
    support_formats = ('.mp3', '.wav', '.ogg', '.flac')
    music_list = [
        f for f in os.listdir('.') 
        if os.path.splitext(f.lower())[1] in support_formats
    ]
    if not music_list:
        print("未找到可用的音频文件,音乐播放器未启动")
        return

    random.shuffle(music_list)
    print(f"随机播放列表:{music_list}")

    pygame.mixer.init()
    while music_list:
        current_song = music_list.pop(0)
        try:
            pygame.mixer.music.load(current_song)
            print(f"正在播放:{current_song}")
            pygame.mixer.music.play()
            # 等待当前歌曲播放完成,加定时休眠降低CPU占用
            while pygame.mixer.music.get_busy():
                pygame.time.Clock().tick(10)
        except Exception as e:
            print(f"加载歌曲{current_song}失败:{str(e)}")
    print("播放列表已全部播放完成")

内容的提问来源于stack exchange,提问作者Dylan Edwards

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:39:00