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.