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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:48:02