Python tqdm 进度条阻塞 winsound

Python tqdm progress bar blocks winsound

我在使用 winsound 和 tq​​dm 时遇到了一些问题。我正在使用显示 2 个站点之间距离的进度条和播放站点名称的 winsound 制作地下控制系统。有进度条但是没有声音

from tqdm import tqdm
import time
import winsound

for i in tqdm(range(100)):
    time.sleep(0.02)

winsound.PlaySound("Nastepna.wav", winsound.SND_ASYNC)

但是当我这样做时:

from tqdm import tqdm
import time
import winsound

winsound.PlaySound("Nastepna.wav", winsound.SND_ASYNC)

for i in tqdm(range(100)):
    time.sleep(0.02)

声音播放没有问题。

来自 winsound documentation SND_ASYNC:

winsound.SND_ASYNC
    Return immediately, allowing sounds to play asynchronously.

所以 SND_ASYNC 标志使得对 PlaySound 的调用是异步的。也就是说,它不会等到声音结束才返回。当您先拨打电话然后有效地休眠 2 秒以显示进度条时,这会很好地工作,因为在程序继续执行时声音有时间播放。

但是当程序的工作完成后你用这种方式播放声音时,PlaySound函数立即returns然后程序就没有别的事可做了,所以它退出了,没有时间播放声音。

您可以通过将 winsound.SND_FILENAME 标志传递给 PlaySound 来更改此行为,这将使调用 同步 ,等待声音结束返回前播放:

from tqdm import tqdm
import time
import winsound

for i in tqdm(range(100)):
    time.sleep(0.02)

winsound.PlaySound("Nastepna.wav", winsound.SND_FILENAME)