首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python -电子游戏音频播放器。结束这首歌,播放下一首

python -电子游戏音频播放器。结束这首歌,播放下一首
EN

Stack Overflow用户
提问于 2014-04-20 16:34:48
回答 2查看 4.1K关注 0票数 0

我被我的蟒蛇音频播放器卡住了。我想要做的是,当歌曲结束时得到事件,这样我就可以播放下一首歌了。我可以切换播放列表文件夹并播放一首歌。但是我怎么才能换到下一个呢?

以下是代码:

代码语言:javascript
复制
import pygame
from pygame.locals import *
import os
import sys
import random
import re

play_stereo = True
songNumber = 0
x = 0
SONG_END = pygame.USEREVENT + 1

pygame.display.set_caption("Pygame Audio player")
screen = pygame.display.set_mode((800, 800), 0, 32)
pygame.init()

def build_file_list():
    file_list = []
    for root, folders, files in os.walk(folderPath):
        folders.sort()
        files.sort()
        for filename in files:
            if re.search(".(aac|mp3|wav|flac|m4a|pls|m3u)$", filename) != None: 
                file_list.append(os.path.join(root, filename))
    return file_list

def play_songs(file_list):
    random.shuffle(file_list)
    pygame.mixer.music.load(file_list[songNumber])
    pygame.mixer.music.play(1)

while True:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_q:
                folderPath = "/Users/dimitristeinel/Documents/git projects/pygame audioplayer/playlist1"
                files = build_file_list()
                play_songs(files)

            if event.key == K_w:
                folderPath = "/Users/dimitristeinel/Documents/git projects/pygame audioplayer/playlist2"
                files = build_file_list()
                print(files)

            if event.key == K_ESCAPE:
                sys.exit()
                break

我真的希望有人能帮忙。提前谢谢..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-20 16:59:07

使用pygame.mixer.music.queue

它排起长队,在第一首歌结束后开始播放:

代码语言:javascript
复制
def play_songs(file_list):
    random.shuffle(file_list)
    pygame.mixer.music.load(file_list[songNumber])
    pygame.mixer.music.play(1)

    for num, song in enumerate(file_list):
        if num == songNumber:
            continue # already playing
        pygame.mixer.music.queue(song)
票数 1
EN

Stack Overflow用户

发布于 2021-01-12 10:59:25

我对pygame.mixer.music.queue也有错误,但是您可以使用以下类:

代码语言:javascript
复制
import pygame

class PlayList:

    playlist_on_play = None
    
    def __init__(self, list_files):
        self.list_files = list_files
        self.song_num = 0
        self.reproducing = False

    def play(self):
        if PlayList.playlist_on_play is not None:
            PlayList.playlist_on_play.stop()
        PlayList.playlist_on_play = self

    def stop(self):
        self.reproducing = False
        self.song_num = 0
        if PlayList.playlist_on_play is self:
            PlayList.playlist_on_play = None

    @staticmethod
    def check(event):
        if PlayList.playlist_on_play is not None:
            pl = PlayList.playlist_on_play
            if not pl.reproducing: # play first song
                pl.play_song(pl.list_files[pl.song_num]) 
                pl.reproducing = True
            if event.type == MUSIC_END and pl.song_num < len(pl.list_files)-1: # play rest of songs 
                pl.song_num += 1
                pl.play_song(pl.list_files[pl.song_num])
            if event.type == MUSIC_END and pl.song_num == len(pl.list_files)-1: # end playlist
                pl.stop()
                print("end playlist")

    def play_song(self, file):
        pygame.mixer.music.load(file)
        pygame.mixer.music.play()

如下所示

代码语言:javascript
复制
if __name__ == "__main__":

    pygame.init()

    screen = pygame.display.set_mode((400, 300))

    MUSIC_END = pygame.USEREVENT+1
    pygame.mixer.music.set_endevent(MUSIC_END)

    list_1 = ["a2.mp3", "a2.mp3", "a2.mp3"]
    list_2 = ["a3.mp3", "a3.mp3", "a3.mp3"]

    playlist1 = PlayList(list_1)
    playlist2 = PlayList(list_2)

    running = True
    while running:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

            PlayList.check(event)

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_q:
                    print("playlist 1")
                    playlist1.play()

                if event.key == pygame.K_w:
                    print("playlist 2")
                    playlist2.play()

                if event.key == pygame.K_ESCAPE:
                    break

    pygame.quit()

对我来说很管用

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23184892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档