Pygame Playlist without while True loop

冷暖自知 提交于 2019-12-24 07:10:38

问题


Here is a short snippet from my code:

import pygame

class Player():

  playlist= ["track1.mp3","track2.mp3",...]

  def __init__(self):
    pygame.init()       
    pygame.mixer.music.load(self.playlist[0])
    pygame.mixer.music.play()

  def playnext(self):
    self.playlist = self.playlist[1:] + [self.playlist[0]]
    pygame.mixer.music.load(self.playlist[0])
    pygame.mixer.music.play()

My problem is that I want to play the next track after the first finished, but without a while true loop. This class is not the only one in my code and I want the others to work while the music plays.

Just like a trigger; when the song ends the playnext() function is called.

Thanks in advance!


回答1:


You can use pygame.mixer.music.set_endevent to make an event appear in the event queue when the music ends. Just check for that event and then change to the next song.

The event will just be an integer (just like all other events) so in order to not shadow another event, use pygame.USEREVENT. If you have other user-defined events, just use pygame.USEREVENT + 1, and then pygame.USEREVENT + 2 and so on. Just make sure it's unique.

Also, try not to put music in your player class; refactor it to another class. One class should preferably only do one thing. I created a short demonstration below. Everything underneath the line if __name__ == '__main__': could be the stuff in your other file.

import pygame
pygame.init()


class MusicPlayer:

    MUSIC_ENDED = pygame.USEREVENT + 1

    def __init__(self):
        pygame.mixer.init()

        self.songs = ["track1.mp3", "track2.mp3"]
        self.current_song_index = 0
        pygame.mixer.music.set_endevent(MusicPlayer.MUSIC_ENDED)

    def play_next(self):
        pygame.mixer.music.load(self.songs[self.current_song_index])
        pygame.mixer.music.play()
        self.current_song_index = (self.current_song_index + 1) % len(self.songs)


if __name__ == '__main__':
    screen = pygame.display.set_mode((720, 480))
    clock = pygame.time.Clock()

    music_player = MusicPlayer()

    running = True
    while running:

        clock.tick(60)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    music_player.play_next()
            elif event.type == music_player.MUSIC_ENDED:
                music_player.play_next()

        pygame.display.update()


来源:https://stackoverflow.com/questions/43834375/pygame-playlist-without-while-true-loop

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!