Как настроить автоматический запуск аудиофайла в pygame после окончания первой песни?
2 Harshit [2017-08-09 19:36:00]
Я попытался использовать функцию очереди, но
pygame.mixer.music.queue(filename)
похоже, не работает.
Вот код, который я использую для запуска моего mp3 файла:
def playmusic(self):
pygame.mixer.init()
pygame.mixer.music.load(self.music_link+self.files[self.file_index])
pygame.mixer.music.play()
self.pausedmusic = 0
self.file_index = self.fileindex + 1
pygame.mixer.music.queue(self.music_link+self.files[self.file_index])
Я пытался использовать события, но не получил от него никакого решения.
И если я использую этот код,
while(pygame.mixer.music.get_busy()):
continue
self.playmusic()
Tkinter GUI не отвечает, но песня продолжает играть, и она автоматически воспроизводит следующую песню, сохраняя мой плеер без ответа, пока все песни не будут воспроизведены.
Я использую Python 3.6.
python pygame
1 ответ
1 skrx [2017-08-09 20:53:00]
Поместите свои музыкальные файлы (пути) в список, определите пользовательский ресурс и вызовите pygame.mixer.music.set_endevent(YOUR_USEREVENT)
. Затем pygame добавит это событие в очередь событий, когда песня закончена, и вы можете выполнить некоторый код, чтобы изменить индекс текущей песни. В приведенном ниже примере вы можете либо увеличить индекс, нажав клавишу со стрелкой вправо, либо дождаться окончания песни (событие SONG_FINISHED
), и программа выберет случайную песню (индекс).
import random
import pygame as pg
pg.mixer.pre_init(44100, -16, 2, 2048)
pg.init()
screen = pg.display.set_mode((640, 480))
# A list of the music file paths.
SONGS = ['file1.ogg', 'file2.ogg', 'file3.ogg']
# Here we create a custom event type (it just an int).
SONG_FINISHED = pg.USEREVENT + 1
# When a song is finished, pygame will add the
# SONG_FINISHED event to the event queue.
pg.mixer.music.set_endevent(SONG_FINISHED)
# Load and play the first song.
pg.mixer.music.load('file1.ogg')
pg.mixer.music.play(0)
def main():
clock = pg.time.Clock()
song_idx = 0 # The index of the current song.
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
elif event.type == pg.KEYDOWN:
# Press right arrow key to increment the
# song index. Modulo is needed to keep
# the index in the correct range.
if event.key == pg.K_RIGHT:
print('Next song.')
song_idx += 1
song_idx %= len(SONGS)
pg.mixer.music.load(SONGS[song_idx])
pg.mixer.music.play(0)
# When a song ends the SONG_FINISHED event is emitted.
# Then just pick a random song and play it.
elif event.type == SONG_FINISHED:
print('Song finished. Playing random song.')
pg.mixer.music.load(random.choice(SONGS))
pg.mixer.music.play(0)
screen.fill((30, 60, 80))
pg.display.flip()
clock.tick(30)
if __name__ == '__main__':
main()
pg.quit()