Progressbar mit ProcessPoolExecutor
Verfasst: Samstag 30. Oktober 2021, 13:15
Hallo,
ich habe mir bereits eine kleine Benutzeroberfläche mit tkinter zusammengebastelt, habe nun aber ein Problem damit den Fortschritt des darauf folgenden Prozesses darzustellen.
Hier eine reduzierte Version, welche die wichtigsten Strukturen meines Codes abbildet:
Also, die Klasse wird mit einer Bildliste gefüttert, die Höhendimension aller Bilder wird zusammenaddiert und in "total_lines" gespeichert.
Dann startet der Hauptprozess, in dem jedes Bild einzeln geöffnet, durch jede Pixelreihe iteriert wird und weitere Bearbeitungen stattfinden werden.
Mein Wunsch wäre es nun ein neues kleines Fenster zu haben in dem sich lediglich ein kleiner Ladebalken befindet, welcher an dieser Stelle anhand des for-loops und der Variable "total_lines" aktualisiert wird.
Kann mir hier vielleicht jemand weiterhelfen? Ich komme da irgendwie nicht weiter...
Vielen Dank im Voraus!
ich habe mir bereits eine kleine Benutzeroberfläche mit tkinter zusammengebastelt, habe nun aber ein Problem damit den Fortschritt des darauf folgenden Prozesses darzustellen.
Hier eine reduzierte Version, welche die wichtigsten Strukturen meines Codes abbildet:
Code: Alles auswählen
import concurrent.futures, time
from PIL import Image
class Process():
total_lines = 0
def __init__(self, images):
self.images = images
for i in self.images:
w, h = Image.open(i).size
self.total_lines+=h
self.t1 = time.perf_counter()
with concurrent.futures.ProcessPoolExecutor() as executor:
r = executor.map(self.start, self.images)
self.t2 = time.perf_counter()
print(f'Finished in {self.t2-self.t1} seconds')
def start(self, img):
w, h = Image.open(img).size
for y1 in range(0, h):
# Processing things here
time.sleep(0.001)
return f'Image {img} processed.'
if __name__ == "__main__":
image_new = Image.new('RGB', (1000,1000), (255, 255, 255))
for name in ['a', 'b', 'c']:
image_new.save(f'{name}.png')
images = ['./a.png', './b.png', './c.png']
a = Process(images)
Dann startet der Hauptprozess, in dem jedes Bild einzeln geöffnet, durch jede Pixelreihe iteriert wird und weitere Bearbeitungen stattfinden werden.
Mein Wunsch wäre es nun ein neues kleines Fenster zu haben in dem sich lediglich ein kleiner Ladebalken befindet, welcher an dieser Stelle anhand des for-loops und der Variable "total_lines" aktualisiert wird.
Code: Alles auswählen
for y1 in range(0, h):
# Processing things here
Vielen Dank im Voraus!