Welcome, guest | Sign In | My Account | Store | Cart
#### 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>")

History