rayo hat geschrieben:Wie wärs mit einem Thread der aus die Keypresses wartet und einer Queue um die Keys zum Abspielthread zu transportieren?
Habe jetzt mal probiert, sowas in der Art zu machen (wie gesagt: erstes Mal) - leider ohne Erfolg.
Der Code:
http://paste.pocoo.org/show/102642/
Zur Erklärung:
Der Player ist jetzt eine Klasse, die von threading.Thread() erbt. Es wird für die Initialisierung eine Playlist übergeben, die in main() den Argumenten von der Kommandozeile entspricht. Die run()-Methode von Thread() habe ich mit der Abarbeitung bzw dem Abspielen der Dateien aus der Playlist überschrieben. run() gibt auch mittels yield den aktuellen Track aus, den main() für den User anzeigt. Das klappt auch alles soweit...
Jetzt dachte ich mir, ich kann aus der Player-Klasse einen Daemon machen, der ja dann eigentlich im Hintergrund laufen müsste. Das klappt aber in einem try-except-Block wohl nicht. Oder liegt es an dem for-Statement wegen dem Iterieren? Oder an beidem? Keine Ahnung...
Auf jeden Fall habe ich den ganzen PLAYING-Kram mal testweise rausgenommen:
Code: Alles auswählen
def main():
playlist = sys.argv[1:]
player = Player(playlist)
player.setDaemon(True)
player.start()
await_user_input()
Nun wird auf einen Tastendruck gewartet, aber keine Musik abgespielt. Sobald ich dann eine Taste drücke, beendet sich das Programm kommentarlos.
Ich bin alles in allem gerade mit meinem Latein am Ende. Wäre nett, wenn sich jemand erbarmen könnte, mir auf die Sprünge zu helfen...
Achso: getkey() unterscheidet jetzt zwischen normalen Zeichen (Buchstabe, Zahl, Bindestrich usw) und besonderen Eingaben wie Richtungstasten, F-Tasten und ähnliches. Diese Sondertasten liefern als erstes Zeichen wohl immer "\x1b" zurück, gefolgt von zwei weiteren Zeichen mit dem eigentlichen Code für die Taste. Zumindest habe ich mir das so erklärt. Es wird also grundsätzlich erstmal ein Zeichen ausgelesen und falls dieses afu so ein Sonderzeichen hindeutet, werden stattdessen die zwei folgenden Zeichen als Rückgabewert genommen.