Multiprocessing mit Tkinter-Fortschrittsbalken, minimales Beispiel
Posted: 14 Jan 2025, 13:50
Ich suche nach einer Möglichkeit, eine Multiprocessing-Aufgabe mit dem Tkinter-Fortschrittsbalken zu verfolgen. Das geht ganz einfach mit tqdm zur Anzeige im Terminal.
Anstelle von tqdm würde ich gerne ttk.Progressbar< verwenden /code>, aber bei allen Versuchen, die ich diesbezüglich unternommen habe, blockieren die Aufgaben den Versuch, den Fortschrittsbalken zu aktualisieren (z. B. mithilfe von update_idletasks und ähnlichem). Unten finden Sie eine Vorlage für die Art von Lösung, nach der ich suche:
In der Lösung möchte ich auch die Ausgabe der Aufgabe erhalten (in diesem Fall eine Liste von x*x).
If Eine andere Multiprocessing-Struktur würde besser funktionieren. Sie können sie gerne anpassen (Pool schien für die Demonstration einfach die einfachste zu sein).
Dies ist eine Frage, die schon einmal bei Stack Overflow gestellt wurde, aber alle vorherigen Antworten Ich habe festgestellt, dass es sich nicht um Minimalbeispiele handelte, und ich fand sie nicht sehr hilfreich.
Anstelle von tqdm würde ich gerne ttk.Progressbar< verwenden /code>, aber bei allen Versuchen, die ich diesbezüglich unternommen habe, blockieren die Aufgaben den Versuch, den Fortschrittsbalken zu aktualisieren (z. B. mithilfe von update_idletasks und ähnlichem). Unten finden Sie eine Vorlage für die Art von Lösung, nach der ich suche:
Code: Select all
import time
from multiprocessing import Pool
from tqdm import tqdm
import tkinter as tk
import tkinter.ttk as ttk
def task(x):
time.sleep(0.1)
return x * x
def start_task():
num_processes = 12
num_tasks = 100
with Pool(processes=num_processes) as pool:
with tqdm(total=num_tasks, desc="Processing") as pbar:
def update_progress(_):
#
pbar.update(1)
for i in range(num_tasks):
pool.apply_async(task, args=(i,), callback=update_progress)
pool.close()
pool.join()
if __name__ == "__main__":
root = tk.Tk()
root.title("Task Progress")
progress_bar = ttk.Progressbar(root, maximum=100, length=300)
progress_bar.pack(pady=20)
button = tk.Button(text="Start", command=start_task)
button.pack(fill="x", padx=10, pady=10)
root.mainloop()
If Eine andere Multiprocessing-Struktur würde besser funktionieren. Sie können sie gerne anpassen (Pool schien für die Demonstration einfach die einfachste zu sein).
Dies ist eine Frage, die schon einmal bei Stack Overflow gestellt wurde, aber alle vorherigen Antworten Ich habe festgestellt, dass es sich nicht um Minimalbeispiele handelte, und ich fand sie nicht sehr hilfreich.