【问题标题】:Python 3 pygame mixer - next songPython 3 pygame 混音器 - 下一首歌
【发布时间】:2017-10-01 19:58:47
【问题描述】:

我是 python 新手,所以请善待。 我最近开始了一个项目,使用 pygame 和 tkinter 的 mp3 播放器并遇到了问题。当前一首歌曲完成后,我无法让播放器转到下一首歌曲。有什么方法可以做到这一点,或者有什么方法可以查看歌曲的长度?

其他一切都很好,玩得很好。这是代码:

#IMPORTS
from tkinter import *
from pygame import mixer
import pygame
import time


#listing music:
music = [
    "Tobu - Candyland.mp3",
    "Alan Walker - Spectre.mp3",
    "Tobu - Hope.mp3",
    "Tobu - Life.mp3",
    "Tobu - Mesmerize.mp3",
    "DEAF KEV - Invincible.mp3",
    "Different Heaven & EH!DE - My Heart.mp3",
    "Disfigure - Blank.mp3",
    "Ahrix - Nova.mp3",
    "Alan Walker - Fade.mp3",
    "jim-yosef-firefly-ncs-release.mp3",
    "Alan Walker - Force.mp3",

    ]

#WINDOW SETTINGS
window = Tk()
window.title("GAMING MUSIC by KOOB")
window.geometry("700x50")
window.wm_iconbitmap('media_logo.ico')

topFrame = Frame(window)
topFrame.pack()

bottomFrame = Frame(window)
bottomFrame.pack(side=BOTTOM)
window.resizable(width=False, height=False)

window["bg"] = "black"

music_number = int(0)
music_number2 = (music_number)
next_music = (music[music_number + 1])
current_music = (music[music_number])

paused = True

#DEFINITIONS BELOW:

def quitprogram():
    time.sleep(0.25)
    window.destroy()
    time.sleep(0.25)
    quit()

def nextsong():
    global songLABEL
    global music_number
    global current_music
    global music
    global music_number2
    global next_music
    mixer.music.stop()
    music_number = int(music_number2 + 1)
    music_number2 = (music_number)
    print (music_number)
    current_music = (music[music_number])
    mixer.music.load(current_music)

    songLABEL.forget()
    time.sleep(0.5)
    songLABEL = Label(text=current_music, fg="white")
    songLABEL.pack(side=TOP)
    songLABEL["bg"] = "black"

    time.sleep(0.5)
    mixer.music.play()

    next_music = (music[music_number + 1])
    pygame.mixer.music.queue(next_music)
    print ("NEXT: ", next_music)


def lastsong():
    global songLABEL
    global music_number
    global current_music
    global music
    global music_number2
    global next_music
    mixer.music.stop()
    music_number = int(music_number2 - 1)
    music_number2 = (music_number)
    print (music_number)
    current_music = (music[music_number])
    mixer.music.load(current_music)

    songLABEL.forget()
    time.sleep(0.5)
    songLABEL = Label(text=current_music, fg="white")
    songLABEL.pack(side=TOP)
    songLABEL["bg"] = "black"

    time.sleep(0.5)
    mixer.music.play()

    next_music = (music[music_number + 1])
    pygame.mixer.music.queue(next_music)
    print ("NEXT: ", next_music)


def playpause():
    global songLABEL
    global current_music
    global next_music
    print(music_number)
    current_music = (music[music_number])
    global paused

    if mixer.get_init():
        if paused is False:
            mixer.music.pause()
            paused = True
        else:
            mixer.music.unpause()
            paused = False
    else:
        mixer.init()
        mixer.music.load(current_music)
        mixer.music.play()
        paused = False

    songLABEL.forget()
    songLABEL = Label(text=current_music, fg="white")
    songLABEL.pack(side=TOP)
    songLABEL["bg"] = "black"

    next_music = (music[music_number + 1])
    pygame.mixer.music.queue(next_music)
    print ("NEXT: ", next_music)

def rewindsong():
    pygame.mixer.music.rewind()


def volumedown():
    pygame.mixer.music.set_volume(pygame.mixer.music.get_volume() - 0.1)


def volumeup():
    pygame.mixer.music.set_volume(pygame.mixer.music.get_volume() + 0.1)



playBUTTON = Button(text="PLAY-PAUSE", fg="white")
playBUTTON.pack(side=LEFT)
playBUTTON.configure(command=playpause)
playBUTTON["bg"] = "black"

nextBUTTON = Button(text=">>>", fg="white")
nextBUTTON.pack(side=LEFT, padx=10)
nextBUTTON.configure(command=nextsong)
nextBUTTON["bg"] = "black"

lastBUTTON = Button(text="<<<", fg="white")
lastBUTTON.pack(side=LEFT, padx=10)
lastBUTTON.configure(command=lastsong)
lastBUTTON["bg"] = "black"

rewindBUTTON = Button(text="replay", fg="white")
rewindBUTTON.pack(side=LEFT, padx=10)
rewindBUTTON.configure(command=rewindsong)
rewindBUTTON["bg"] = "black"

volumedownBUTTON = Button(text="VOL -", fg="white")
volumedownBUTTON.pack(side=LEFT, padx=10)
volumedownBUTTON.configure(command=volumedown)
volumedownBUTTON["bg"] = "black"

volumeupBUTTON = Button(text="VOL +", fg="white")
volumeupBUTTON.pack(side=LEFT, padx=10)
volumeupBUTTON.configure(command=volumeup)
volumeupBUTTON["bg"] = "black"

songLABEL = Label(text="music provided by NoCopyrightSounds", fg="white")
songLABEL.pack(side=TOP)
songLABEL["bg"] = "black"

window.protocol('WM_DELETE_WINDOW', quitprogram)

#THE WINDOW BEING KEPT OPEN
window.mainloop()

【问题讨论】:

  • 最近回答了一个类似的问题,可以帮到你:stackoverflow.com/a/46462023/6486738
  • 这个答案可能也有帮助:stackoverflow.com/a/43836610/6486738
  • 还是不行。我将您所说的内容放入代码中,但出现了:for event in mixer.music.get_endevent(): TypeError: 'int' object is not iterable
  • 仔细阅读答案。 for event in mixer.music.get_endevent(): 没有在任何链接中提及。
  • 然后它说虽然对于 pygame.event.get() 中的事件:pygame.error: video system not initialized

标签: python pygame mp3 mixer


【解决方案1】:

当你告诉 Python 在歌曲结束后要做什么时,你需要让它成为这样的事件:

def nextsong(event):
    global index
    index += 1
    pygame.mixer.music.load(listofsongs[index])
    pygame.mixer.music.play()

【讨论】:

    【解决方案2】:

    你可以试试这个。它是一个功能齐全的音乐播放器,使用 tkinter 作为窗口(授予丑陋的 GUI,仍然需要工作)和 pygame 作为音乐播放器。该代码将所有文件定位在本地“音乐”目录中,将它们添加到列表中,以便它们可以按顺序播放或随机播放。还有一个选项可以重复所有曲目或单个曲目。显然还有播放/暂停、停止和跳过曲目的按钮。

    from os import listdir
    from pygame import mixer
    from random import shuffle
    from tkinter import Tk, Button, Label
    
    # Initialize the window and the mixer
    window = Tk()
    mixer.init()
    
    # get list of files
    playlist = listdir('./Music')
    active_playlist = playlist
    shuffled_playlist = []
    
    # Get number of files
    file_range = len(playlist) - 1
    
    # Settings variables used to control play logic
    music_option = True
    shuffle_music = False
    indexed_track = 0
    display_track = indexed_track + 1
    is_stopped = True
    is_paused = False
    is_started = False
    repeat_track = False
    repeat_all = False
    
    
    # Shuffle music logic
    def shuffle_playlist():
        global shuffle_music, playlist, is_started, shuffled_playlist, indexed_track, is_stopped, active_playlist
        indexed_track = 0
        if shuffle_music:
            shuffle_music = False
            active_playlist = playlist
        else:
            shuffle_music = True
            shuffle(playlist)
            shuffled_playlist = playlist
            playlist = listdir('./Music')
        update_display()
    
    
    # Repeat one or all logic
    def repeat_loop():
        global repeat_all, repeat_track
        if not repeat_track and not repeat_all:
            repeat_track = True
            repeat_button.config(text="?")
        elif repeat_track:
            repeat_track = False
            repeat_all = True
            repeat_button.config(text="?")
        elif repeat_all:
            repeat_all = False
            repeat_button.config(text="?")
    
    
    # Updates the display values of the current track number and name
    def update_display():
        global display_track
        display_track = playlist.index(active_playlist.__getitem__(indexed_track)) + 1
        track_num_display.config(text=f"Track: {display_track}")
        track_name_display.config(text=f"Now Playing:\n{active_playlist.__getitem__(indexed_track)}")
    
    
    # Logic to run music
    def start_music():
        global indexed_track, is_started, is_stopped, active_playlist
    
        # Determine if random or normal play
        if shuffle_music:
            active_playlist = shuffled_playlist
        else:
            active_playlist = playlist
    
        # If music is not already playing, it has not been stopped or paused then grabs next song in queue
        while not mixer.music.get_busy() and not is_stopped and not is_paused and not is_started:
            mixer.music.load(f"./Music/{active_playlist.__getitem__(indexed_track)}")
            mixer.music.play()
            is_started = True
        # While music is playing check every 100 milliseconds if music track has finished playing and re-trigger music.
        if mixer.music.get_busy():
            window.after(100, start_music)
        else:
            # Repeat logic
            if not is_stopped and not is_paused:
                # If not repeating then at last track trigger stop
                if not repeat_all and not repeat_track and indexed_track == file_range:
                    stop_music()
    
                # Repeat one logic reduce index call by 1 prior to adding 1 so always stay on same track
                elif repeat_track:
                    indexed_track -= 1
    
                # Else it is repeating all
                indexed_track += 1
                is_started = False
    
                # Checks to make sure track is not skipped past last song or into negative.
                if indexed_track < 0 or indexed_track > file_range:
                    indexed_track = 0
    
                # Update the display with current track info
                update_display()
    
                # Repeat music
                start_music()
    
    
    # Gets the current status of the music player
    def music_status():
        music_yes = mixer.music.get_busy()
        return music_yes
    
    
    # Stop the music from playing. If already stopped then it resets repeat status and the playlist
    def stop_music():
        global is_stopped, is_started, indexed_track, repeat_all, repeat_track
        if is_stopped:
            indexed_track = 0
            repeat_all = False
            repeat_track = False
            update_display()
        mixer.music.stop()
        is_stopped = True
        is_started = False
        start_music()
    
    
    # Skip to next track
    def next_track():
        global indexed_track, is_started
        # If music is playing stop it and move it to the next track and start again
        music_playing = music_status()
        if music_playing:
            mixer.music.stop()
            if indexed_track == file_range:
                indexed_track = 0
                is_started = False
            start_music()
    
        # If music is not playing move to next track and if on last track move to first
        else:
            if indexed_track != file_range:
                indexed_track += 1
            else:
                indexed_track = 0
        update_display()
    
    
    # Skip to last track
    def prev_track():
        global indexed_track, is_started
        # If music is playing stop it move to prior track or if on first track move to last track.
        music_playing = music_status()
        if music_playing:
            if display_track == 1:
                indexed_track = file_range
                is_started = False
            else:
                indexed_track -= 2
            mixer.music.stop()
            start_music()
    
        # If music is not playing skip back one, if on first track move to last track
        else:
            if indexed_track != 0:
                indexed_track -= 1
            else:
                indexed_track = file_range
        update_display()
    
    
    # Play or pause logic
    def play_track():
        global is_paused, is_stopped
        music_playing = music_status()
        # If music is playing then pause it and mark the paused flag as True
        if music_playing:
            is_paused = True
            mixer.music.pause()
    
        # Else it was paused so unpause and mark paused flag as False
        else:
            is_paused = False
            mixer.music.unpause()
    
        # Mark stopped as False and start music
        is_stopped = False
        start_music()
    
    
    # Control buttons
    previous_button = Button(text="⏮", font=("", 12, ""), command=prev_track)
    previous_button.grid(row=2, column=0)
    stop_button = Button(text="⏹", font=("", 12, ""), command=stop_music)
    stop_button.grid(row=2, column=1)
    start_button = Button(text="⏯", font=("", 12, ""), command=play_track)
    start_button.grid(row=2, column=2)
    next_button = Button(text="⏭", font=("", 12, ""), command=next_track)
    next_button.grid(row=2, column=3)
    repeat_button = Button(text="?", font=("", 16, ""), command=repeat_loop)
    repeat_button.grid(row=3, column=2)
    shuffle_button = Button(text="?", command=shuffle_playlist)
    shuffle_button.grid(row=3, column=1)
    
    # Displayed information
    track_num_display = Label(text=f"Track: {display_track}")
    track_name_display = Label(text=f"Now Playing:\n{active_playlist.__getitem__(indexed_track)}")
    track_num_display.grid(row=0, column=1, columnspan=2)
    track_name_display.grid(row=1, column=0, columnspan=4)
    
    # Loop main window
    window.mainloop()
    

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多