python可以';使用pygame change播放音频时不要中断循环

python可以';使用pygame change播放音频时不要中断循环,python,while-loop,pygame,keyboard,break,Python,While Loop,Pygame,Keyboard,Break,我尝试了一些新的东西来适应代码。现在,当我按ctrl+s时,音频确实停止,但当我的个人助理在同一次跑步中再次播放音乐时,音乐不会像第一次那样停止: import glob import os import keyboard os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide" import pygame songs = glob.glob("C:\\Users\zivsi\Music\\*.mp3") import random song =

我尝试了一些新的东西来适应代码。现在,当我按ctrl+s时,音频确实停止,但当我的个人助理在同一次跑步中再次播放音乐时,音乐不会像第一次那样停止:

import glob
import os
import keyboard

os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide"

import pygame
songs = glob.glob("C:\\Users\zivsi\Music\\*.mp3")
import random

song = random.choice(songs)

with open("song_choice.txt", "r") as file:
    read = file.read()

if (read == song):
    print("switch song")
    song = random.choice(songs)

song_name = song.replace("C:\\Users\zivsi\Music\\", "").replace(".mp3", "")
print("song: ", song_name)

pygame.mixer.init()

music = pygame.mixer.music.load(song)
pygame.mixer.music.play()

while (pygame.mixer_music.get_busy()):
    pygame.time.Clock().tick(10)
    keyboard.add_hotkey("ctrl + s", lambda: pygame.mixer_music.stop())

#如果我按ctrl+s,音乐将停止,但它只工作一次`

您不能在不同的范围内使用
break
,它必须是循环套件本身的一部分(因此嵌套在
while
for
语句中)。lambda是一个函数,它是一个不同的作用域

因为您希望异步中断循环,所以需要其他一些方式从键盘回调处理程序通信回主循环。在一般的计算机工程术语中,您需要某种方式来同步同时发生的不同事情

也就是说,您想设置某种标志,一种可以在
while
循环中检查的标志,因此
while pygame.mixer\u music.get\u busy()而不是键盘[u ctrl\u s\u]标志:
。您可以使用任何全局值执行此操作,这可能是安全的:

然后您可以在循环中使用它:

# reset the flag to false, in case it was already set to true before
keyboard_ctrl_s_flag = False  
while pygame.mixer_music.get_busy() and not keyboard_ctrl_s_flag:
    pygame.time.Clock().tick(10)
我说这可能是安全的,因为我不太确定PyGame是如何运行其事件处理循环的。假设您在循环中也使用了
pygame.time.Clock().tick(10)
,我认为事件循环可能会在执行其他操作之前等待Python代码返回控制


下次用户使用
CTRL-S
时,调用
control\u\u handler()
回调,
keyboard\u CTRL\u\u flag
设置为
True
,当控件返回到
while
循环时(因为
pygame.time.Clock()。勾选(10)
将控件返回到Python代码)
while
循环即使
pygame.mixer\u music.get\u busy()
仍然存在。

您不能在不同的作用域中使用
break
,不。
lambda
是函数,因此是不同的作用域。改为设置一个标志。如何在我的代码中写入标志?可以从
while
循环可以测试的函数中更改的任何值都可以。类似于
flags[0]=True
,其中
flags
是设置为
[False]
(可能有更多值)的全局列表。难看,但它会起作用。或全局实例上的属性。等等。您不希望在循环中有像keyboard.addhotkey这样的函数,如图所示。注意:问题中的代码没有使用pygame的事件队列,它需要一个窗口才能工作。@sloth:出于某种原因,我认为使用的
键盘
模块是pygame的一部分,我应该仔细看看。
# reset the flag to false, in case it was already set to true before
keyboard_ctrl_s_flag = False  
while pygame.mixer_music.get_busy() and not keyboard_ctrl_s_flag:
    pygame.time.Clock().tick(10)