Pyglet,播放器,下一首歌

1 投票
2 回答
1962 浏览
提问于 2025-04-17 18:54

我正在尝试通过 pyglet 在 Python 3 中播放歌曲。我可以播放和停止一首歌,但当我想播放下一首歌时就会出现错误。我按照这些说明进行了操作。 我会在 tkinter 中做这个程序。

我的代码:

import pyglet
import glob
from tkinter import Tk, Button
songs=glob.glob("*.mp3")
player=pyglet.media.Player()
def play_song():
    global player
    for i in range(len(songs)):
        source=pyglet.resource.media(songs[i])
        player.queue(source)
    player.play()
def pause_song():
    player.pause()
def next_song():
    player.next()

window=Tk()
play_=Button(text="play", command=play_song)
play_.pack()
pause_=Button(text="pause", command=pause_song)
pause_.pack()
next_=Button(text="next", command=next_song)
next_.pack()
window.mainloop()

错误信息:

Exception in Tkinter callback
Traceback (most recent call last):
   File "C:\Python33\lib\tkinter\__init__.py", line 1442, in __call__
   return self.func(*args)
  File "C:\Documents and Settings\Fany\Dokumenty\Hudba\Sabaton\2012 - Carolus Rex\py.py", line 15, in next_song
    player.next()
 AttributeError: 'Player' object has no attribute 'next'

2 个回答

0

你可以使用 os 模块,或者看看如何播放下一首歌。我觉得这对很多人会有帮助,不管你是用 os 模块还是其他方法。要播放下一首歌,可以使用全局变量,这一点很重要。

from tkinter import *
import os


root = Tk()
root.geometry("500x500")
root.title("music player ")
Label(root, text="MUSIC PLAYER").pack()
i=0

def prev():
   pass
def paly():
    music_dir = 'D:\songs'
    songs = os.listdir(music_dir)
    print(songs)
    os.startfile(os.path.join(music_dir, songs[0]))
def nxt():
    global i
    music_dir = 'D:\songs'
    songs = os.listdir(music_dir)
    print(songs)
    os.startfile(os.path.join(music_dir, songs[i]))
    i=i+1
f1=Frame(root).pack()
Button(f1,text="prev",command=prev).pack(side=LEFT,padx=30)
Button(f1,text="play/pause",command=paly).pack(side=LEFT,padx=30)
Button(f1,text="next",command=nxt).pack(side=LEFT,padx=30)


root.mainloop()
0

试着对你的 next_song() 函数做以下修改

def next_song():
    player.next_source()

原因
可以参考这个页面
https://pyglet.readthedocs.org/en/pyglet-1.2-maintenance/api/pyglet/media/pyglet.media.Player.html#pyglet.media.Player.time

你会发现 next() 这个方法已经被标记为“过时”,建议使用 next_source() 来代替

希望这对你有帮助

附言 当我在我的电脑上测试你的代码时,它是可以正常工作的。

撰写回答