gpt4 book ai didi

python - 没有 while True 循环的 Pygame 播放列表

转载 作者:太空宇宙 更新时间:2023-11-03 15:16:37 30 4
gpt4 key购买 nike

这是我的代码的一小段:

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() 函数。

提前致谢!

最佳答案

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

该事件只是一个整数(就像所有其他事件一样),因此为了不影响另一个事件,请使用pygame.USEREVENT。如果您有其他用户定义的事件,只需使用pygame.USEREVENT + 1,然后使用pygame.USEREVENT + 2,依此类推。只要确保它是唯一的即可。

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

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

关于python - 没有 while True 循环的 Pygame 播放列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43834375/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com