python-3.x - 有循环中断列表框?
问题描述
我正在制作一个音乐播放器(我已经完成了大部分工作)并且我刚刚制作了它,以便在歌曲完成时自动播放下一首歌曲(这就是它的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()
提前致谢!
解决方案
由于while
循环checkFinished(...)
会阻塞主线程,请尝试删除while
循环并root.after()
改用:
def checkFinished(finished):
for event in pygame.event.get():
if event.type == finished:
print("Finished {}\n\n".format(listofsongs[index]))
nextSong(event)
root.after(10, checkFinished, finished)
推荐阅读
- javascript - 启用禁用的输入类型图像不起作用
- scala - scala中的演员参考
- python - 如何在另一个函数中使用来自一个函数的数据?
- javascript - 用逗号分隔循环中的每个项目
- python - 如何在 gekko 中动态构建约束?
- arduino - 安装后 Visual Studio Code Platform IO 缺少图标
- cassandra - dsbulk 卸载丢失的数据
- flutter - 在运行时将图像从计算机上传并显示到 FLUTTER WEB APP
- angular - 如何在Angular 9中的所有组件中使用带有表单的单个模态?
- java - Eclipse JAXRS POST 请求有效负载未转换为请求模型对象