Код 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()