Skip to content

Instantly share code, notes, and snippets.

@avamsi
Last active August 8, 2016 16:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save avamsi/9af5f9cda0e3a5fcf5e6ed15c1126854 to your computer and use it in GitHub Desktop.
Save avamsi/9af5f9cda0e3a5fcf5e6ed15c1126854 to your computer and use it in GitHub Desktop.
from threading import Thread
from tkinter import Tk
from tkinter.ttk import Progressbar
from queue import Queue
class ProgressDialog(object):
def __init__(self, name, maximum):
self._dialog = Tk()
self._max = maximum
self._set_properties(name)
self._add_progress_bar()
def _set_properties(self, name):
self._dialog.geometry('420x42+-10+0')
self._dialog.title(name)
self._dialog.resizable(0, 0)
self._dialog.bind('<Escape>', self._close)
def _add_progress_bar(self):
self._progressbar = Progressbar(self._dialog, length=400, maximum=self._max)
self._progressbar.pack()
self._progressbar.pack(pady=10)
def _set_progress(self, value):
self._progressbar['value'] = value
progress = property(fset=_set_progress)
def show(self):
self._dialog.focus_force()
self._dialog.after(100, self._poll)
self._dialog.mainloop()
def _poll(self):
if self._progressbar['value'] >= self._max:
self._close()
self._dialog.after(100, self._poll)
def _close(self, event=None):
self._dialog.quit()
def progress_dialog_async(*args, **kwargs):
progress_dialog_queue = Queue()
def create_progress_dialog():
progress_dialog = ProgressDialog(*args, **kwargs)
progress_dialog_queue.put(progress_dialog)
progress_dialog.show()
Thread(target=create_progress_dialog).start()
return progress_dialog_queue.get()
if __name__ == '__main__':
import time
dialog = progress_dialog_async('blah', 100)
for i in range(1, 101):
dialog.progress = i
time.sleep(.02)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment