2017-05-07 48 views
1

這裏是我的一小段代碼: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]混淆。 –

回答

1

當音樂結束時,您可以使用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()