Код Python3 Playsound Tkinter не работает в ожидаемом порядке

Я хочу вызвать функцию (триггер), которая скроет одно изображение, покажет другое изображение и воспроизведет звук. Звук должен воспроизводиться последним, так как он длится несколько секунд, блокируя все. Когда я вызываю эту функцию, мой сигнал будильника воспроизводится в течение нескольких секунд, затем отображается изображение, показывающее, какой датчик сработал (исходное изображение не скрывает, не уверен, что я делаю там не так, но закомментировал только решение одной проблемы за раз ).

Сначала я поискал в коде другие варианты использования слова «триггер», чтобы узнать, не вызываю ли я другую функцию.

Строку отображения изображения я заключил в скобки.

Добавлена ​​задержка в 1 секунду между отображением изображения и воспроизведением звука.

Пытался включить звук будильника в другой функции, которая вызывается функцией отображения изображения, поэтому нажатие кнопки вызывает функцию отображения изображения, функция отображения изображения вызывает функцию воспроизведения звука.

Каждый раз, когда воспроизводится звук, а затем, когда он заканчивается, появляется изображение. Пока воспроизводится звук, программа заблокирована.

      Button(root, text='Trigger Security', bg='#F0F8FF', font=('arial', 12, 'normal'), command=trigger).place(x=10, y=95)

def trigger():
    #canvas.create_image(260,-70, anchor=NW, image=bowstbradarm, state='hidden')
    canvas.create_image(260,-70, anchor=NW, image=bowstbradar, state='normal')
    playsound("tng_red_alert1.mp3")

Можно ли запускать 2 функции одновременно, чтобы моя программа не зависала?

Я на Ubuntu использую IDLE, если это вообще помогает.

1 ответ

Решение

Это связано с тем, что по умолчанию это функция блокировки, поэтому она блокирует обновление основного цикла tkinter до тех пор, пока звуковой файл не будет полностью воспроизведен.

Вы можете выполнить в неблокирующем режиме, передав False в качестве второго аргумента:

      playsound("tng_red_alert1.mp3", False)

Обновление: как block=False не поддерживается в Linux, вам нужно использовать поток для выполнения playsound():

      import threading
...

threading.Thread(target=playsound, args=("tng_red_alert1.mp3",)).start()
Другие вопросы по тегам