我如何遍历歌曲列表并依次播放它们
How can I Iterate through a list of songs and play them one after eachother
我希望遍历 Songs = ["Song1.mp3", "Song2.mp3", "Song3.mp3"]
等歌曲列表,我想逐首播放每首歌曲。
我尝试了各种方法,最推荐的似乎是使用 pygame,但是,我无法调试使用它所带来的大量错误。我的主要源代码和尝试如下所示:
from tkinter import *
import pygame
from random import choice
import os
pygame.mixer.init()
Songs = os.listdir("Music\")
def Play():
Song = choice(Songs)
pygame.mixer.music.load("Music\" + Song)
pygame.mixer.music.play()
while True:
play()
在 运行 之后我收到错误 pygame.error: ModPlug_Load failed
。
我正在 运行 同时在我的幻灯片程序中使用它,我希望这段代码 运行 作为背景音乐,我计划在一个函数中检查歌曲的结尾我已经设置好了。
如果是桌面应用程序,您有多个播放文件的选项,通常取决于:
同样为了避免Tkinter被卡住,你需要使用线程或者多进程。我推荐你使用 soundfile player,你会在这里找到例子 https://realpython.com/playing-and-recording-sound-python/
使用 pygame.mixer.music.get_busy()
检测音乐流是否正在播放。当没有流处于活动状态时播放列表中的下一首歌曲。例如:
import pygame
play_list = ["song1.mp3", "song2.mp3", "song3.mp3"]
current_list = []
pygame.init()
clock = pygame.time.Clock()
run = True
while run:
clock.tick(100)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if not pygame.mixer.music.get_busy():
if not current_list:
current_list = play_list[:]
current_song = current_list.pop(0)
pygame.mixer.music.load(current_song)
pygame.mixer.music.play()
pygame.quit()
exit()
您可以使用 pygame.mixer.music.set_endevent()
.
注册一个自定义事件,该事件将在音乐播放完毕时触发
如果您想 运行 与主应用程序并发,您还需要 运行 子线程中的 while 循环。
下面是一个例子:
import os
import random
import threading
import tkinter as tk
import pygame
pygame.init()
# create a custom event
MUSIC_DONE = pygame.event.custom_type()
# register the event
pygame.mixer.music.set_endevent(MUSIC_DONE)
folder = "Music\"
Songs = os.listdir(folder)
def next_song():
try:
song = random.choice(Songs)
pygame.mixer.music.load(os.path.join(folder, song))
pygame.mixer.music.play()
# update song name
song_var.set(song)
except Exception as e:
print(e)
def pygame_loop():
next_song()
while pygame.get_init():
for event in pygame.event.get():
if event.type == MUSIC_DONE:
# current song done playing, play next song
next_song()
root = tk.Tk()
# label to show the current song being played
song_var = tk.StringVar()
tk.Label(root, textvariable=song_var).pack()
# start the pygame loop in a child thread
threading.Thread(target=pygame_loop).start()
root.mainloop()
# quit pygame
pygame.quit()
我希望遍历 Songs = ["Song1.mp3", "Song2.mp3", "Song3.mp3"]
等歌曲列表,我想逐首播放每首歌曲。
我尝试了各种方法,最推荐的似乎是使用 pygame,但是,我无法调试使用它所带来的大量错误。我的主要源代码和尝试如下所示:
from tkinter import *
import pygame
from random import choice
import os
pygame.mixer.init()
Songs = os.listdir("Music\")
def Play():
Song = choice(Songs)
pygame.mixer.music.load("Music\" + Song)
pygame.mixer.music.play()
while True:
play()
在 运行 之后我收到错误 pygame.error: ModPlug_Load failed
。
我正在 运行 同时在我的幻灯片程序中使用它,我希望这段代码 运行 作为背景音乐,我计划在一个函数中检查歌曲的结尾我已经设置好了。
如果是桌面应用程序,您有多个播放文件的选项,通常取决于:
同样为了避免Tkinter被卡住,你需要使用线程或者多进程。我推荐你使用 soundfile player,你会在这里找到例子 https://realpython.com/playing-and-recording-sound-python/
使用 pygame.mixer.music.get_busy()
检测音乐流是否正在播放。当没有流处于活动状态时播放列表中的下一首歌曲。例如:
import pygame
play_list = ["song1.mp3", "song2.mp3", "song3.mp3"]
current_list = []
pygame.init()
clock = pygame.time.Clock()
run = True
while run:
clock.tick(100)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if not pygame.mixer.music.get_busy():
if not current_list:
current_list = play_list[:]
current_song = current_list.pop(0)
pygame.mixer.music.load(current_song)
pygame.mixer.music.play()
pygame.quit()
exit()
您可以使用 pygame.mixer.music.set_endevent()
.
如果您想 运行 与主应用程序并发,您还需要 运行 子线程中的 while 循环。
下面是一个例子:
import os
import random
import threading
import tkinter as tk
import pygame
pygame.init()
# create a custom event
MUSIC_DONE = pygame.event.custom_type()
# register the event
pygame.mixer.music.set_endevent(MUSIC_DONE)
folder = "Music\"
Songs = os.listdir(folder)
def next_song():
try:
song = random.choice(Songs)
pygame.mixer.music.load(os.path.join(folder, song))
pygame.mixer.music.play()
# update song name
song_var.set(song)
except Exception as e:
print(e)
def pygame_loop():
next_song()
while pygame.get_init():
for event in pygame.event.get():
if event.type == MUSIC_DONE:
# current song done playing, play next song
next_song()
root = tk.Tk()
# label to show the current song being played
song_var = tk.StringVar()
tk.Label(root, textvariable=song_var).pack()
# start the pygame loop in a child thread
threading.Thread(target=pygame_loop).start()
root.mainloop()
# quit pygame
pygame.quit()