Pygame, выполнить команду после того, как звук проиграется полностью

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

Например, я хочу, чтобы после проигрывания звукового файла число в заголовке tkinter увеличивалось на 1.

Но если сделать вот так:

import tkinter as tk
import pygame

root = tk.Tk()
root.geometry ("500x500")
pygame.mixer.pre_init(44100, -16, 1, 512)
pygame.init()
test = pygame.mixer.Sound("5.wav")

for a in range(1, 11):
    test.play()
    root.title(str(a))
root.mainloop()

то число начнёт увеличиваться на 1 сразу же после начала проигрывания файла, не дождавшись его окончания. Более того, сразу же после увеличения числа звук начнёт проигрываться сразу же, и в результате получается какофония.

А как надо правильно сделать? Если что, этот код я писал под Ubuntu 20.04.


Ответы (1 шт):

Автор решения: Daniil Loban

Вот код который проигрывает файл 10 раз:

import tkinter as tk
import pygame

root = tk.Tk()
root.geometry ("500x500")
pygame.mixer.pre_init(44100, -16, 1, 512)
pygame.init()

run = True

def stop():
    global run
    run = False

root.protocol("WM_DELETE_WINDOW", stop)

test = pygame.mixer.Sound("5.wav")

a = 0

while run:
    root.update_idletasks()
    root.update()
    if (a < 10 and not pygame.mixer.get_busy()):
      test.play()
      root.title(str(a))
      a += 1

Обратите внимание что я заменил: root.mainloop() на

while True:
    root.update_idletasks()
    root.update()

таким образом проигрывание звука происходит в основном цикле, а не до, как это было в приведенном в вопросе коде. И вместо цикла for используется тот же while для основного цикла, ограничения задаются условием if a < 10 , а так же мы проверяем не проигрывается ли сейчас звук not pygame.mixer.get_busy() т.е. дожидаемся когда он проиграется и лишь затем выполняем действия.

→ Ссылка