Как настроить автоматический запуск аудиофайла в 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()