#### Realoader code ########### # Based on this file: # https://github.com/pallets/werkzeug/blob/master/werkzeug/_reloader.py import time, os, sys, subprocess class ReloaderLoop(object): def restart_with_reloader(self): """Spawn a new Python interpreter with the same arguments as this one, but running the reloader thread. """ while 1: print("starting Tkinter application...") args = [sys.executable] + sys.argv new_environ = os.environ.copy() new_environ['TKINTER_RUN_MAIN'] = 'true' # a weird bug on windows. sometimes unicode strings end up in the # environment and subprocess.call does not like this, encode them # to latin1 and continue. if os.name == 'nt' and PY2: for key, value in iteritems(new_environ): if isinstance(value, text_type): new_environ[key] = value.encode('iso-8859-1') exit_code = subprocess.call(args, env=new_environ, close_fds=False) if exit_code != 3: return exit_code def trigger_reload(self): self.log_reload() sys.exit(3) def log_reload(self): print("reloading...") def run_with_reloader(app, *hotkeys): """Run the given function in an independent python interpreter.""" import signal signal.signal(signal.SIGTERM, lambda *args: sys.exit(0)) reloader = ReloaderLoop() try: if os.environ.get('TKINTER_RUN_MAIN') == 'true': for hotkey in hotkeys: app.bind_all(hotkey, lambda event: reloader.trigger_reload()) app.mainloop() else: sys.exit(reloader.restart_with_reloader()) except KeyboardInterrupt: pass ##################################### # # Example of usage # try: from Tkinter import Tk, Label except ImportError: from tkinter import Tk, Label class App(Tk): def __init__(self): Tk.__init__(self) self.label = Label(self, text="Press Control+r to reload the application") self.label.pack() # Press Controol-R or Control-r to reload application run_with_reloader(App(), "<Control-R>", "<Control-r>")