Имеет разрывы цикла Listbox? - PullRequest
       26

Имеет разрывы цикла Listbox?

0 голосов
/ 04 декабря 2018

Я создаю музыкальный проигрыватель (что я в основном сделал), и я просто сделал так, чтобы он автоматически воспроизводил следующую песню, когда песня закончилась (это то, что делает 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()

Заранее спасибо!

1 Ответ

0 голосов
/ 04 декабря 2018

Поскольку цикл 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)
...