Индикатор выполнения Python TQDM блокирует Winsound - PullRequest
0 голосов
/ 07 декабря 2018

У меня проблемы с winsound и tqdm.Я создаю подземную систему управления, используя индикатор выполнения, показывающий расстояние между двумя станциями, и 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)

звук воспроизводится без проблем.

1 Ответ

0 голосов
/ 07 декабря 2018

Из документации winsound на SND_ASYNC:

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

Таким образом, флаг SND_ASYNC делает вызов PlaySound асинхронным.То есть он не ждет завершения звука перед возвратом.Это прекрасно работает, когда вы сначала делаете вызов, а затем фактически спите в течение 2 секунд, отображая индикатор выполнения, потому что у звука есть время для воспроизведения, пока программа продолжает выполняться.

Но когда вы воспроизводите звук в этомпосле завершения работы программы, функция PlaySound немедленно возвращается, а затем программе больше нечего делать, поэтому она завершается, не давая времени воспроизводить звук.

Вы можете изменить этоповедение, передавая флаг 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)
...