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

如何按下指定按键终止运行中的函数和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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:57:01