簡體   English   中英

我需要通過在 Pygame 中創建循環來獲得幫助

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM