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