2016-06-24 18 views
0

Ich versuche gtk.ProgressBar.set_text('Text') zu arbeiten, wenn ich auf eine Schaltfläche klicke, vorher, um meine subprocess zu starten.PyGTK ProgressBar, um etwas anzuzeigen, bevor der Subprozess startet

Hier ist mein Code (vollständige Quelle here):

def on_button_clicked(self, button, progress_bar, filename): 
    self.execute(progress_bar, filename) 

def execute(self, progress_bar, filename): 
    progress_bar.set_text('Encoding') 
    progress_bar.pulse() 

    cmd = ['ffmpeg', '-y', 
     '-i', filename, 
     '-r', '30', 
     '/tmp/test-encode.mkv'] 

    process = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE) 

    process.wait() 

    progress_bar.set_text('Done') 

Ich versuchte progress_bar.set_text('Encoding') in on_button_clicked() bewegen, aber es ändert nichts: ich auf die Schaltfläche klicken, wird der Auftrag erledigt (die Datei ordnungsgemäß hergestellt wird und OK) und nur dann zeigt der Fortschrittsbalken "Fertig" an.

Ich habe meine Hausaufgaben gemacht und alle damit verbundenen Fragen gelesen, aber sie verwenden entweder subprocess nicht, oder analysieren "normale" Befehlsausgaben.

+0

'process.wait()' blockiert höchstwahrscheinlich GUI-Aktualisierungen. Versuchen Sie stattdessen mit 'waitAsync'. – Ilya

+0

Wo ist diese waitAsync-Funktion dokumentiert (wenn möglich in einem Python-Kontext)? Ich glaube, ich muss process.wait (eine Subprozessmethode) verwenden, um das Ganze zum Laufen zu bringen. Ich könnte hinzufügen, wie kann es alles blockieren * bevor * es überhaupt beginnt? Denn, nun, zumindest sollte ich die Fortschrittsanzeige "Encoding" sehen, auch wenn der Balken nicht pulsiert ..? Ich denke nicht, dass dies ein GUI-Aktualisierungsproblem ist, IMHO. – yPhil

+0

http://api.gtkd.org/src/gio/Subprocess.html – Ilya

Antwort

0

Fügen Sie einfach

progress_bar.set_text('Encoding') 

while gtk.events_pending():  # this forces GTK to refresh the screen 
    gtk.main_iteration() 

in on_button_clicked() GTK zu zwingen, den Bildschirm zu aktualisieren, bevor Sie fortfahren.

Sie könnten sogar

progress_bar.set_text('Finished') 
while gtk.events_pending():  # this forces GTK to refresh the screen 
    gtk.main_iteration() 

in execute hinzufügen, sobald die Datei geschrieben wird.