【发布时间】:2018-12-03 21:01:01
【问题描述】:
我正在制作一个音乐播放器(我已经完成了大部分工作),我刚刚制作了它,以便在歌曲播放完后自动播放下一首歌曲(这就是 def checkFinished() 所做的。)
我遇到的问题是在checkFinished() 中我使用了一个循环(查看歌曲是否完成),并且循环似乎破坏了 Tkinter 列表框 - 我认为这是循环,因为删除循环修复了问题。
这是我的代码:
import os
from tkinter.filedialog import askdirectory
import pygame
from mutagen.id3 import ID3
from tkinter import *
root = Tk()
root.minsize(300,300)
listofsongs = []
realnames = []
v = StringVar()
songlabel = Label(root,textvariable=v,width=35)
index = 0
def updatelabel():
global index
global songname
v.set(realnames[index])
def nextSong(event):
global index
index += 1
pygame.mixer.music.load(listofsongs[index])
pygame.mixer.music.play()
updatelabel()
def prevSong(event):
global index
index -= 1
pygame.mixer.music.load(listofsongs[index])
pygame.mixer.music.play()
updatelabel()
def stopSong(event):
pygame.mixer.music.stop()
v.set("")
def playSong(event):
pygame.mixer.music.play()
print("Now playing {}".format(listofsongs[index]))
def checkFinished(finished):
while True:
for event in pygame.event.get():
if event.type == finished:
print("Finished {}\n\n".format(listofsongs[index]))
nextSong(event)
def directorychooser():
directory = askdirectory()
os.chdir(directory)
for files in os.listdir(directory):
if files.endswith(".mp3"):
realdir = os.path.realpath(files)
try:
audio = ID3(realdir)
realnames.append(audio['TIT2'].text[0])
except:
realnames.append(files)
listofsongs.append(files)
pygame.init()
pygame.mixer.init()
clock = pygame.time.Clock()
finished = pygame.USEREVENT + 1
pygame.mixer.music.set_endevent(finished)
pygame.mixer.music.load(listofsongs[0])
pygame.mixer.music.play()
print("\n\nNow playing {}".format(listofsongs[0]))
checkFinished(finished)
directorychooser()
label = Label(root,text='Music Player',width="20",height="5")
label.pack()
listbox = Listbox(root,width="80")
listbox.pack()
realnames.reverse()
for items in realnames:
listbox.insert(0,items)
realnames.reverse()
playButton = Button(root,text="Play Song",width="15")
playButton.pack()
stopButton = Button(root,text="Stop Song",width="15")
stopButton.pack()
nextButton = Button(root,text="Next Song",width="15")
nextButton.pack()
previousButton = Button(root,text="Previous Song",width="15")
previousButton.pack()
playButton.bind("<Button-1>",playSong)
stopButton.bind("<Button-1>",stopSong)
nextButton.bind("<Button-1>",nextSong)
previousButton.bind("<Button-1>",prevSong)
songlabel.pack()
root.mainloop()
提前致谢!
【问题讨论】:
-
“循环似乎破坏了 Tkinter 列表框”是什么意思?如果是 UI 问题,请分享截图
-
@Kanal 别担心,acw1668 的回答似乎有效。无论如何谢谢:)
标签: python-3.x tkinter pygame listboxitem audio-player