首页 > 解决方案 > 有循环中断列表框?

问题描述

我正在制作一个音乐播放器(我已经完成了大部分工作)并且我刚刚制作了它,以便在歌曲完成时自动播放下一首歌曲(这就是它的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()

提前致谢!

标签: python-3.xtkinterpygamelistboxitemaudio-player

解决方案


由于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)

推荐阅读