Pygame的播放列表,无需而真正的循环

问题描述:

这里是我的一小段代码:Pygame的播放列表,无需而真正的循环

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() 

我的问题是,我想后的第一个最终以播放下一首曲目,但没有一个真正的同时循环。这个课程不是我的代码中唯一的一个,我希望其他人在音乐播放时工作。

就像一个触发器;当歌曲结束时,调用playnext()函数。

提前致谢!

+0

为什么你需要这个? –

+1

@JoshuaNixon为了顺序播放音乐,他/她需要它不是很明显吗? –

+1

另外,为了不让其他人感到困惑,你可以删除这行代码。“这是我的代码的MCVE”。对MCVE来说,它似乎常常有些混乱([mcve]) ,但它推断代码可以按原样执行,这样其他人就可以测试和验证你描述的行为/错误,并且它是最小的。你的代码目前只是一个简单的例子(如果你愿意的话),我不认为这个问题本身是错误的,但不应该与实际的[mcve]混淆。 –

当音乐结束时,您可以使用pygame.mixer.music.set_endevent使事件队列中显示一个事件。只需检查该事件,然后切换到下一首歌曲。

该事件将只是一个整数(就像所有其他事件),所以为了不影响其他事件,请使用pygame.USEREVENT。如果您有其他用户定义的事件,则只需使用pygame.USEREVENT + 1,然后使用pygame.USEREVENT + 2等。只要确保它是独一无二的。

另外,尽量不要把音乐放在你的播放器类中;重构它到另一个类。一类最好只做一件事。下面我创建了一个简短的演示。行下面的所有内容都可能是您其他文件中的内容。

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()