mp3 player

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
_joseph_
User
Beiträge: 1
Registriert: Freitag 5. Juni 2015, 13:44

ich hab ein Programm geschrieben, das mp3 darein abspielen soll.
Das Problem ist aber ,dass wenn man einen Titel überspringt es die Lieder danach nicht mehr in der Reihenfolge von der liste "filelist" abspielt.
Kann mir bitte jemand helfen.

Code: Alles auswählen

import pygame,Tkinter,glob,time,thread,random
filelist=glob.glob("*.mp3")
pygame.mixer.init(22050,-16,2,4096)
main = Tkinter.Tk()
global start
start = 0

def back():
    global start
    if start > 2:
        start -= 2
        forward = 1
        thread.start_new_thread(play,())
        
def skip():
    forward = 1
    thread.start_new_thread(play,())
    
def resume():
    pygame.mixer.music.unpause()
    pause["text"] = "pause"
    pause["command"] = play_pause
    
def play_pause():
    pygame.mixer.music.pause()
    pause["text"] = "play"
    pause["command"] = resume
    
def shuffle_list():
    global start
    start = 0
    random.shuffle(filelist)
    shuffle_var = 1
    thread.start_new_thread(play,())
    
lb = Tkinter.Label(main)
lb.pack()
back_button = Tkinter.Button(main,text = "back",command = back)
back_button.pack()
pause = Tkinter.Button(main,text = "pause",command = play_pause)
pause.pack()
skip_button = Tkinter.Button(main,text = "skip", command = skip)
skip_button.pack()
shuffle = Tkinter.Button(main,text = "shuffle",command = shuffle_list)
shuffle.pack()
scb = Tkinter.Scrollbar(main,orient = "vertical")
file_list = Tkinter.Listbox(main,height = 10, yscrollcommand = scb.set)
scb["command"] = file_list.yview
file_list.pack(side = "left")
scb.pack(side = "left")

def play():
    global start
    shuffle_var = 0
    forward = 0
    file_list.delete(0,"end")
    for file in filelist:
        file_list.insert("end",file)
    for file in filelist[start:len(filelist)]:
        start += 1
        pygame.mixer.music.load(file)
        pygame.mixer.music.play()
        lb["text"] = file
        while pygame.mixer.music.get_busy():
            if shuffle_var == 1 or forward == 1:
                break
            else:
                time.sleep(5)
        if shuffle_var == 1 or forward == 1:
            break

thread.start_new_thread(play,())
main.mainloop()

BlackJack

@_joseph_: Das Programm ist ganz grundsätzlich kaputt weil die GUI von einem anderen als dem Thread verändert wird in dem die `mainloop()` läuft. Damit ist das Verhalten des Programms undefiniert weil Tk, wie die meisten GUI-Rahmenwerke, nicht so einfach thread-sicher sind.

``global`` hat in einem sauberen Programm nichts zu suchen. Werte betreten Funktionen und Methoden als Argumente und verlassen sie als Rückgabewerte. Das mit globalen Variablen zu machen ist höchst undurchsichtig und fehleranfällig.

Code auf Modulebene sollte nur Konstanten, Funktionen, und Klassen definieren. Das Hauptprogramm gehört in eine Funktion. Und bei GUI-Programmierung kommt man um objektorientierte Programmierung (OOP), also eigene Klassen entwerfen, nicht wirklich drum herum.

Das `thread`-Modul sollte man schon lange nicht mehr verwenden, das ist vom `threading`-Modul abgelöst worden. Da Pygame die Musik schon nebenläufig abspielt sollte man auch gänzlich ohne eigene Threads auskommen.

Ausserdem sollte man die Programmlogik und die GUI besser trennen und am besten erst die Programmlogik umsetzen. Wenn die fertig und getestet ist, kann man den GUI-Code dazu schreiben der auf dem vorhandenen Code aufsetzt.
Antworten