How to unconditionally re-run a python program based on button click?

后端 未结 2 1584
旧时难觅i
旧时难觅i 2021-01-21 18:41

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

相关标签:
2条回答
  • 2021-01-21 18:50

    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.

    0 讨论(0)
  • 2021-01-21 19:09

    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()
    
    0 讨论(0)
提交回复
热议问题