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 шт):
Вот код который проигрывает файл 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() т.е. дожидаемся когда он проиграется и лишь затем выполняем действия.