如何按下指定按键终止运行中的函数和while循环并启动新循环
核心问题原因
你当前使用的playsound库默认是同步阻塞模式,调用playsound(type)后代码会卡住直到整首音频播放完成,期间键盘检测逻辑完全不会执行,自然无法响应按键停止播放。
改造方案
通过非阻塞播放+全局停止标记的组合实现需求,修改后的完整代码如下:
import keyboard import time from playsound import playsound # 全局停止标记,控制当前播放是否终止 stop_flag = False def Song(type,opt): global stop_flag stop_flag = False print(opt) # 第二个参数block=False开启异步非阻塞播放,播放同时代码继续往下走 playsound(type, block=False) # 播放过程中持续检测停止标记 while not stop_flag: # 每0.1秒检测一次,避免占用过高CPU time.sleep(0.1) print('''Enter Your Music Selection: O) Overworld F) Fighting B) Boss-Strong Enemy V) Victory I) Inside-Taven-Shop D) Dungion L) Lose-Death ''') while True: # 优先检测Q键停止 if keyboard.is_pressed('q'): stop_flag = True # 等待100ms确保停止逻辑执行完成 time.sleep(0.1) continue if keyboard.is_pressed('O'): Song('MusicStuff/test0.wav','Overworld Theme') if keyboard.is_pressed('F'): Song('MusicStuff/TrashLine.wav','Fighting Theme') # 剩余B/V/I/D/L的逻辑可以按照上面的格式自行补充 time.sleep(0.05)
改动说明
- 新增全局变量
stop_flag作为播放终止的控制标记 playsound调用新增block=False参数,开启异步非阻塞播放,主逻辑不会卡在播放步骤- 歌曲播放函数内新增循环检测停止标记,标记触发时立刻结束播放流程
- 主循环优先检测Q键按下事件,触发后更新停止标记终止当前播放,即可响应后续其他歌曲选择按键
如果你的playsound版本不支持非阻塞模式,可以替换为pygame.mixer模块实现音频播放,控制逻辑更灵活。
内容的提问来源于stack exchange,提问作者GreenyPM
相关产品推荐
相关产品推荐

