1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
   | from threading import Thread
from concurrent.futures import ThreadPoolExecutor as Pool
import time
 
def launcher(count, on_update, on_done):
 
    left = count
    step = 100 / count
    def callback(future):
        nonlocal left
        left -= 1
        on_update(step)
        if left == 0:
            on_done()
 
    with Pool(max_workers=2) as pool:
        for z in range(count):
            future = pool.submit(subprocess.call, 'python -c "import time; time.sleep(0.5)"')
            future.add_done_callback(callback)
 
if __name__ == '__main__':
 
    import tkinter as tk
    from tkinter.constants import *
    from tkinter import ttk
 
    root = tk.Tk()
 
    def updater(root, pb):
        def _do_update(x):
            root.after_idle(lambda: pb.step(x))
        return _do_update
 
    def on_done():
        def reset():
            pb.pack_forget()
            start_btn['state'] = NORMAL
        root.after_idle(reset)
 
    def do_launch():
        start_btn['state'] = DISABLED
        pb.pack()
        update = updater(root, pb) 
        p = Thread(target=launcher, args=(150, update, on_done))
        p.daemon = True
        p.start()
 
    start_btn = tk.Button(root, text='start', command=do_launch)
    start_btn.pack()
    pb = ttk.Progressbar(root, orient=HORIZONTAL, length=200, mode='determinate')
 
    tk.mainloop() | 
Partager