import tkinter from tkinter import simpledialog from tkinter import ttk from queue import Queue class ProgressDialog(simpledialog.SimpleDialog): def __init__(self, master, text='', title=None, class_=None): super().__init__(master=master, text=text, title=title, class_=class_) self.default = None self.cancel = None self._queue = Queue() self._bar = ttk.Progressbar(self.root, orient="horizontal", length=200, mode="determinate") self._bar.pack(expand=True, fill=tkinter.X, side=tkinter.BOTTOM) self.root.attributes("-topmost", True) self.root.after(200, self._update) def set_progress(self, value): self._queue.put(value) def _update(self): while self._queue.qsize(): try: self._bar['value'] = self._queue.get(0) except Queue.Empty: pass self.root.after(200, self._update) if __name__ == '__main__': root = tkinter.Tk() root.withdraw() p = ProgressDialog(master=root, text='Downloading Something...', title='Download') import threading def _do_progress(): import time for i in range(1, 11): time.sleep(0.5) p.set_progress(i*10) p.done(0) t = threading.Thread(target=_do_progress) t.start() p.go() print('Download Completed!')