GUI friert ein bei subprocess.call(self.args)
Verfasst: Dienstag 27. Juli 2010, 21:49
Ich bin dabei, ein CD-Ripper Frontend zu schreiben und bin jetzt an dem Punkt, wo der Konsolenbefehl an das Backend geschickt wird. Dies geschieht in einer Schleife über alle ausgewählten Tracks einer CD. Solange der Konsolenbefehl ausgeführt wird, ist das GUI aber unbenutzbar, was nicht sein soll. Änderungen, die zwischendurch an das GUI geschickt werden, werden erst nach dem Ende der Schleife ausgeführt. Wenn das GUI minimiert und dann wieder vergrößert wird, ist der Inhalt verschwunden, und wird erst aktualisiert, wenn die Schleife zu Ende ist. Ich habe versucht, das Problem zu lösen, indem ich die entsprechende Funktion in einen eigenen Thread gepackt habe, leider ohne Erfolg. Es sollen auch nicht alle Threads der Schleife parallel gestartet werden (sonst würde das Programm ja versuchen, mehrere Tracks gleichzeitig zu rippen), sondern erst, wenn der vorige Thread abgeschlossen ist. Es geht nur darum, dass das GUI normal bedienbar ist, während die Unterprozesse laufen.
Ich habe hier versucht, das Skript auf das Problem zu reduzieren:
Ich habe hier versucht, das Skript auf das Problem zu reduzieren:
Code: Alles auswählen
#!/usr/bin/python
#-*- coding: utf-8 -*-
import gtk, subprocess, threading, thread
class MainClass(object):
def __init__(self): # build gui
""" Initialisiert das Fenster """
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect("delete_event", self.event_delete)
self.window.connect("destroy", self.destroy)
self.window.set_default_size(350, 100)
self.window.show()
self.box = gtk.HBox()
self.box.show()
self.window.add(self.box)
self.widGoButton = gtk.Button("Start ripping")
self.widGoButton.show()
self.widGoButton.connect('clicked', self.actGoButton)
self.box.add(self.widGoButton)
self.text = gtk.Entry()
self.text.show()
self.box.add(self.text)
def actGoButton(self, widget):
for n in range(1, 3):
self.text.set_text(str(n)) # wird erst nach ablauf der schleife sichtbar :-(
self.args = ("cdparanoia", "-Z", "-B", "-d", "/dev/scd0", str(n), "/home/atarax/Desktop/Rip/wav")
variante = 1
if (variante == 0):
# funktioniert, aber gui friert ein, solange die schleife läuft :-(
self.actRip()
elif (variante == 1):
# funktioniert, aber gui friert ein, solange die schleife läuft :-(
grabThread = threading.Thread(group=None, target=self.actRip(), name=None, args=self.args)
grabThread.start()
else:
# gibt fehlermeldung: Unhandled exception in thread started by Error in sys.excepthook :-(
thread.start_new_thread(self.actRip, ())
def actRip(self):
retcode = subprocess.call(self.args)
def event_delete(self, widget, event, data=None):
""" reagiert auf 'delete_event' """
return False
def destroy(self, data=None):
""" reagiert auf 'destroy' """
gtk.main_quit()
def main(self):
""" Nachrichtenschleife """
gtk.main()
if __name__ == "__main__":
MyApp = MainClass()
MyApp.main()