Skip to content Skip to sidebar Skip to footer

How To Unconditionally Re-run A Python Program Based On Button Click?

At the end of my program execution, I want a popup message to appear that has a button which can re-run a program. Obviously, I will have setup a function that the button calls whe

Solution 1:

I suggest that you use the subprocess module to re-execute the program which was designed to replace the older os.exec...() group of functions.

Here's a runnable (i.e. complete) example of how to use it to restart the script, which was tested on Windows with Python 3.6.4:

import os
import subprocess
import sys
import tkinter as tk
import traceback

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.pack(fill="none", expand=True)  # Center the button.
        self.create_widgets()

    def create_widgets(self):
        self.restart_btn = tk.Button(self, text='Restart', command=self.restart)
        self.restart_btn.grid()

    def restart(self):
        command = '"{}" "{}" "{}"'.format(
            sys.executable,             # Python interpreter
            __file__,                   # argv[0] - this file
            os.path.basename(__file__), # argv[1] - this file without path
        )
        try:
            subprocess.Popen(command)
        except Exception:
            traceback.print_exc()
            sys.exit('fatal error occurred rerunning script')
        else:
            self.quit()


app = Application()
app.master.title('Restartable application')
app.mainloop()

Solution 2:

This is potentially an over-simple approach, but say your existing program looks something like:

def my_app():
    # Code goes here

if __name__ == "__main__":
    my_app()

Instead wrap it like this:

def my_app():
    print("App is running!")
    # Your app code goes here
    print("App is exiting!")
    # On exit popup a prompt where selecting 'restart' sets restart_on_exit to True
    # Replace input() with a popup as required
    if input("Type y <return> to restart the app! ").lower() == "y":
        return True

if __name__ == "__main__":
    restart_on_exit = True
    while restart_on_exit:
        restart_on_exit = my_app()

That way the code will loop, running my_app over and over again, if the popup sets restart_on_exit to True before the loop repeats.


Post a Comment for "How To Unconditionally Re-run A Python Program Based On Button Click?"