[英]I need help by creating a loop in Pygame
我有以下代码
def play_music():
song = playlist.get(ACTIVE)
next_one = playlist.curselection()
next_one = next_one[0]+1
pygame.mixer.music.load(song)
pygame.mixer.music.play(loops=0)
pygame.mixer.music.set_endevent()
for event in pygame.event.get():
playlist.selection_clear(0,END)
playlist.activate(next_one)
playlist.select_set(next_one,last=None)
song = playlist.get(ACTIVE)
pygame.mixer.music.queue(song)
当我运行代码时,它会播放一首歌曲,然后播放播放列表中的下一首歌曲。 但我想将其实现为一个循环。 它应该对下一首歌曲进行排队,播放列表中的歌曲数量与播放列表中的歌曲一样多(即:我在播放列表中有 5 首歌曲,然后我想要,我只需要按一次播放按钮,然后播放所有 5 首歌曲,逐个。)
我的程序图片: https://i.stack.imgur.com/T5Gch.png希望你能帮助我。 提前谢谢你的帮助。
这是我对Utilizing the pygame.mixer.music.get_endevent() 的回答中的示例
它创建自己的事件MUSIC_END
并将其分配给 music endevent 。
稍后它会加载一首歌曲并将下一首歌曲添加到队列中。
当第一首歌曲结束时,它将生成/发送事件MUSIC_END
。 但这需要为for event in pygame.event.get()
事件一直运行以捕获此事件并运行将下一首歌曲添加到队列的代码。
当它完成下一首歌曲时,它将再次生成/发送事件MUSIC_END
,该循环将捕获歌曲并将其再次添加到队列中。
对于更多歌曲,它需要将所有歌曲保留在列表中,并记住必须将列表中的哪首歌添加到队列中。
编辑:
与歌曲列表一起使用并更改的版本也在 label 上显示文本。
import pygame
import tkinter as tk
def check_event():
global current_song
global next_song
for event in pygame.event.get():
if event.type == MUSIC_END:
print('music end event')
# calculate index for current song (which was takes from queue)
#current_song = (current_song + 1) % len(songs)
current_song = next_song
# add title for current song
label['text'] = songs[current_song]
# calculate index for next song
next_song = (current_song + 1) % len(songs)
# add to queue next song
pygame.mixer.music.queue(songs[next_song])
# run again after 100ms (0.1s)
root.after(100, check_event)
def play():
label['text'] = songs[current_song]
pygame.mixer.music.play()
# --- main ---
songs = [
'audio1.wav',
'hello-world-of-python.mp3',
]
current_song = 0
next_song = 1
pygame.init()
# define new type of event
MUSIC_END = pygame.USEREVENT+1
# assign event to `endevent`
pygame.mixer.music.set_endevent(MUSIC_END)
# play first song
pygame.mixer.music.load(songs[current_song])
# calculate index for next song
next_song = (current_song + 1) % len(songs)
# add to queue next song
pygame.mixer.music.queue(songs[next_song])
root = tk.Tk()
label = tk.Label(root)
label.pack()
button = tk.Button(root, text='Play', command=play)
button.pack()
check_event()
root.mainloop()
pygame.quit()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.