2016-10-19 5 views
1

Ich habe eine PyQT GUI-Anwendung progress_bar.py mit einem einzigen progressbar und einem externen Modul worker.py mit einer process_files() Funktion, die eine gewisse Routine mit einer Liste von Dateien funktioniert und Berichte aktuellen Fortschritt mit percent variabel.Bericht Fortschritte QProgressBar mit Variable aus einer importierten Modul

Was ich tun möchte, ist den aktuellen Fortschritt des worker.process_files zu berichten QProgressBar.setValue() Methode, aber ich habe keine Ahnung, wie es zu implementieren

Hier sind meine Module (Callback-Funktion, oder was?):

progress_bar.py

import sys 
from PyQt4 import QtGui 
from worker import process_files 


class Window(QtGui.QMainWindow): 

    def __init__(self): 
     super(Window, self).__init__() 
     self.setGeometry(100, 100, 300, 100) 
     self.progress = QtGui.QProgressBar(self) 
     self.progress.setGeometry(100, 50, 150, 20) 
     self.progress.setValue(0) 
     self.show() 


app = QtGui.QApplication(sys.argv) 
GUI = Window() 
# process files and report progress using .setValue(percent) 
process_files() 
sys.exit(app.exec_()) 

worker.py

def process_files(): 
    file_list = ['file1', 'file2', 'file3'] 
    counter = 0 
    for file in file_list: 
     # do_stuff_with_the_file 
     counter += 1 
     percent = 100 * counter/len(file_list) 
     print percent 

Antwort

2

Machen Sie die process_files Funktion eine Generatorfunktion, die einen Wert (der Istwert) und gibt es als Rückruf auf ein Verfahren in Ihrer Window Klasse ergibt, die den Fortschrittsbalken Wert aktualisiert. Ich habe einen time.sleep Anruf in Ihrer Funktion hinzugefügt, damit Sie den Fortschritt beobachten können:

import time 
from worker import process_files 

class Window(QtGui.QMainWindow): 
    def __init__(self): 
     ... 

    def observe_process(self, func=None): 
     try: 
      for prog in func(): 
       self.progress.setValue(prog) 
     except TypeError: 
      print('callback function must be a generator function that yields integer values') 
      raise 


app = QtGui.QApplication(sys.argv) 
GUI = Window() 
# process files and report progress using .setValue(percent) 
GUI.observe_process(process_files) 
sys.exit(app.exec_()) 

worker.py

def process_files(): 
    file_list = ['file1', 'file2', 'file3'] 
    counter = 0 
    for file in file_list: 
     counter += 1 
     percent = 100 * counter/len(file_list) 
     time.sleep(1) 
     yield percent 

Ergebnis:

Nach der Verarbeitung file2

enter image description here

+2

Es ist erwähnenswert, dass Sie wahrscheinlich 'QApplication.processEvents()' jedes Mal durch die Schleife aufrufen müssen, um das Fortschrittsbalkenupdate zu sehen. Solange der Hauptthread in Ihrer 'process_files'-Funktion beschäftigt ist, wird die Steuerung niemals an die Ereignisschleife zurückgegeben, um die GUI anderweitig zu aktualisieren und neu zu zeichnen. –

+0

@ BrendanAbel Danke für's Bemerken. Etwas was ich wegen des einfachen Testfalls nicht bemerkt habe :) –

Verwandte Themen