[英]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.