Python游戏项目使用winsound实现音乐启停功能的bug修复问询
问题根因
- 你定义的
music变量是Main()函数内的局部变量,每次递归调用Main()后值都会被重置,设置的布尔状态根本没有被持久保存,完全起不到判断播放状态的作用 - 关闭音乐的分支调用了和开启音乐完全相同的
winsound.PlaySound参数,等于每次点关闭都会重新触发一次播放逻辑,自然会出现未播放时点关闭也播放、播放时点关闭重启的问题 - 用递归调用
Main()实现菜单循环的写法存在栈溢出风险,长时间多次选择后会触发程序崩溃
修复代码
import winsound # 全局变量持久保存音乐播放状态 music_playing = False def Main(): global music_playing # 用循环替代递归实现菜单重复选择 while True: print("-------------------------------------------") choice = input("\n1.See coins \n2.fight \n3.music on \n4.music off \n5.quit \nInput:") if choice == "1": print("you have: ", character.coins) elif choice == "2": battlestate() elif choice == "3": # 仅未播放状态下才触发开启逻辑 if not music_playing: winsound.PlaySound("311 - Love from Afar.wav", winsound.SND_ASYNC | winsound.SND_ALIAS) music_playing = True elif choice == "4": # 仅播放状态下才触发关闭逻辑 if music_playing: # 停止播放需传入None作为音频路径,用SND_PURGE清空当前播放 winsound.PlaySound(None, winsound.SND_PURGE) music_playing = False elif choice == "5": quit() else: print("i dont understand, please try again!")
修改说明
- 新增全局变量
music_playing存储播放状态,函数内用global声明避免被判定为局部变量 - 启停音乐前先判断当前状态,避免重复触发导致的异常
- 停止音乐调用官方指定的停止接口,不会触发重新播放
- 替换递归为循环,消除栈溢出风险
内容的提问来源于stack exchange,提问作者Lore
相关产品推荐
相关产品推荐

