如果您刚刚播放声音并让它中断之前播放的任何内容,请winsound
执行以下操作:
import winsound
from time import sleep
winsound.PlaySound("sound.wav", winsound.SND_ASYNC | winsound.SND_FILENAME)
sleep(1)
winsound.PlaySound("sound.wav", winsound.SND_ASYNC | winsound.SND_FILENAME)
sleep(3)
在本例中(假设sound.wav
超过一秒),声音将开始播放,1 秒后中断并重新开始播放。第二个sleep
是为了避免脚本在声音停止之前结束(停止脚本会停止声音)。
如果您想在代码继续运行的同时将声音排队播放一个接一个:
import threading
import queue
import winsound
from time import sleep
q = queue.Queue()
def thread_function():
while True:
sound = q.get()
if sound is None:
break
winsound.PlaySound(sound, winsound.SND_FILENAME)
if __name__ == "__main__":
t = threading.Thread(target=thread_function)
t.start()
q.put("sound.wav")
print('One...')
sleep(1)
q.put("sound.wav")
print('Two...')
sleep(1)
q.put("sound.wav")
print('Three...')
q.put(None)
t.join()
这个简单的示例将线程开始播放的声音排入队列,然后在播放时将下一个声音排入队列,稍后再排第三个。您会注意到声音一个接一个地播放,并且程序仅在声音播放完毕时停止(并且线程由于None
队列末尾的 而停止)。
如果您希望在另一种声音上播放一种声音并让它们混合,则使用winsound
将不起作用,但您可以使用pyglet
.
例如:
import pyglet
window = pyglet.window.Window()
effect = pyglet.resource.media('sound.wav', streaming=False)
@window.event
def on_key_press(symbol, modifiers):
effect.play()
@window.event
def on_draw():
window.clear()
if __name__ == "__main__":
pyglet.app.run()
这个例子打开一个窗口,每次你按下一个键,它会立即播放声音,不会打断之前的声音。当您关闭窗口时,程序会立即结束。