2016-07-12 11 views
0

Hallo Ich möchte die Ausgabe von youtube dl auf cmd lesen und in meinem wxpython-Programm. Dies ist die Funktion, die ich benutzt habe.Lesen Sie Parameter wie eta von youtube-dl

 def execute(self,command,textctrl): 
       process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
       output = '' 

       # Poll process for new output until finished 
       for line in iter(process.stdout.readline, ""): 
        textctrl.AppendText(line) 
        output += line 


       process.wait() 
       exitCode = process.returncode 

       if (exitCode == 0): 
        return output 
       else: 
        raise Exception(command, exitCode, output) 

Das wxpython-Programm begann mit der Aktualisierung der textctrl und dann eingefroren. Es aktualisiert nicht die Eta, Größe, Geschwindigkeit usw.

+0

Warum verwenden Sie nicht die [youtube-dl-API] (https://github.com/rg3/youtube-dl/blob/master/README.md#embedding-youtube-dl)? – phihag

Antwort

0

Solange Sie in dieser Funktion blockiert sind und die Kontrolle nicht auf die Ereignisschleife zurückkehren lassen, dann können keine Ereignisse an Handler gesendet werden. Wenn keine Ereignisse gesendet und verarbeitet werden, können die Inhalte der Widgets nicht neu gezeichnet werden, keine Interaktion mit der Maus und der Tastatur, nichts. Grundsätzlich ist die Anwendung eingefroren, weil Ihre Ausführungsfunktion das Herz nicht schlagen lässt und das Gehirn vom Rest des Körpers abgeschnitten ist.

Bei der Programmierung von GUIs oder anderen Implementierungen von ereignisgesteuerter Programmierung besteht der Schlüssel darin, in einem Event-Handler oder Callback nie etwas mehr als eine merkbare Zeit zu nehmen, bevor es zur Ereignisschleife zurückkehrt. Wenn Sie etwas haben, das länger als diese Zeit dauert, müssen Sie es neu entwerfen, damit die lang andauernde Aufgabe auf andere Weise verwaltet wird.

Ein Weg wäre, Dinge im Event-Handler einzurichten (z. B. den Prozess zu starten) und dann vom Event-Handler zurückzukommen. Teil dieses Setups wäre es, einen Timer zu starten, der periodisch zurückkehrt und prüft, ob eine Ausgabe verfügbar ist. Wenn ja, dann lies es (ohne zu blockieren) und verarbeite es und kehre dann wieder zur Ereignisschleife zurück. Fahren Sie fort, bis der Prozess abgeschlossen ist, und stoppen Sie den Timer, nachdem der letzte Datenblock verarbeitet wurde.

Ein anderer Ansatz besteht darin, einen Thread zum Ausführen der lang andauernden Aufgabe zu verwenden. Dies ist ein gängiger Ansatz, aber Sie müssen darauf achten, keine UI-Objekte aus dem Arbeitsthread zu bearbeiten. In diesem Beispiel muss der Text, den Sie aus dem Prozess gelesen haben, zurück an den GUI-Thread gesendet werden, damit er an das Textsteuerelement angehängt wird. wx.CallAfter ist eine einfache Möglichkeit, das zu tun.

Weitere Details und einige Beispiele finden Sie unter https://wiki.wxpython.org/LongRunningTasks.

+0

Ok danke. Ich werde das versuchen und danke auch für die Links – Boikem