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
相关产品推荐
相关产品推荐

