简体   繁体   中英

How to play the next song in file after the song is finished automatically using pygame

I'm making a music player using pygame. But I cannot understand how to play the next song automatically after the previous song is finished. My program is reading all mp3 files in a selected folder first. Can you tell me how to do it?

import tkinter.filedialog as filedialog
import os
import pygame

directory = filedialog.askdirectory()
os.chdir(directory)
song_list = []
for file in os.listdir(directory):
    if file.endswith('.mp3'):
         song_list.append(file)
pygame.mixer.init()
pygame.mixer.music.load(song_list[0])
pygame.mixer.music.play()

I want to play the next song after the first song in finished automatically.

The files could be played in the initial for loop and you don't need to have them in a list then play them.

Regarding playing the mp3 files you need to wait for the music to play before exiting. And after finishing each files you can start playing the next one in the same way.

import tkinter.filedialog as filedialog
import os
import pygame

directory = filedialog.askdirectory()
print("Loding files from directory:", directory)
os.chdir(directory)
pygame.mixer.init()
for file in os.listdir(directory):
    if file.endswith('.mp3'):
        print("Playing file:", file)
        pygame.mixer.music.load(file)
        pygame.mixer.music.play()
        # Wait for the music to play before exiting 
        while pygame.mixer.music.get_busy():   
            pygame.time.Clock().tick(5)

You can select any song in the directory through Listbox and can play it too.

if you want to play all song one by one, You can add another button say 'Play_all' and assign the code by @saloua to that button.

ringtone folder is placed inside the same folder where this "audio_player.py" is present.

#audio_player.py
import os
import tkinter as tk
import pygame

def songs_list():
    files = [file for file in os.listdir('ringtone')]
    List = []
    for file in files:
        List.append(str(file))
        #print(file)
    #print(List)
    return List

def play(song_name):

    song_name_label['text'] = "Now Playing: " + song_name
    pygame.mixer.init()
    pygame.mixer.music.load("./ringtone/" + song_name)
    print("Playing:", song_name)
    pygame.mixer.music.play()

window = tk.Tk()
window .title("Any Name")
Height = 720
Width = 1080

# define size of window
canvas = tk.Canvas(window, bg='#3cd1fa',  height=Height, width=Width)
canvas.pack()

# play button **************************************************
play_button_frame = tk.Frame(window)
play_button_frame.place(relx=0.40, rely=0.88, relheight=0.1, relwidth=0.10)

play_button = tk.Button(play_button_frame, text="Play", font=25, fg='#d1d1d1', bg='black',
                        command=lambda: play(listbox.get(listbox.curselection()))  )
play_button.place(relx=0.01, rely=0.005, relheight=0.98, relwidth=0.49)


#list box (playlist) *************************************************
listbox_frame = tk.Frame(window, bg='green')
listbox_frame.place(relx=0.7, rely=0.2, relheight=0.6, relwidth=0.29)

listbox = tk.Listbox(listbox_frame, bg="white", selectmode='ACTIVE')
listbox.place(relx=0.01, rely=0.01, relheight=0.98, relwidth=0.98)

# song name *****************************************************************
song_name_frame = tk.Frame(window, bg='white')
song_name_frame.place(relx=0.20, rely=0.1, relheight=0.05, relwidth=0.60)
song_name_label = tk.Label(song_name_frame,font=("times now roman", 10))
song_name_label.place(relx=0.0, rely=0, relheight=1, relwidth=1)

# PLaylist, to display song in the list
playlist = songs_list()
for item in playlist:
    listbox.insert(tk.END, item)
# auto selecting 1st element of list box
listbox.selection_set( first = 0 )

window.mainloop()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM