如何通过单击按钮重新执行我的 Python 程序

use*_*793 4 python python-3.x

我有一个程序正在无休止地编辑,每次进行更改时,我都必须退出并重新启动。我希望能够重新加载和重新启动,而不必退出并再次返回。

这是一个名为 reload.py 的文件中的一个简单程序,如果有类似 reexec 的东西可用,它将执行我想要的操作:

from tkinter import *

class Application(Frame):
    def do_load(self):
        print("time to reload")
        reexec("reload.py")

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.my_reload = Button(self)
        self.my_reload["text"] = "Reload",
        self.my_reload["command"] = self.do_load
        self.my_reload.pack()


if __name__ == '__main__':
    root = Tk()
    app = Application(master=root)
    app.mainloop()
Run Code Online (Sandbox Code Playgroud)

我尝试使用重新加载 Application 类:

def do_load(self):
    print("time to reload")
    reload(Application)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

File "python3.4/importlib/__init__.py", line 122, in reload
    raise TypeError("reload() argument must be module")
TypeError: reload() argument must be module
Run Code Online (Sandbox Code Playgroud)

这是我需要了解有关模块的更多信息的 RTFM 案例吗?

任何帮助或建议将被欣然接受。

Gal*_*vid 5

为了在importlib这里使用,您必须重新加载主模块,并杀死 TK 实例,这样 python 将成功地使用编辑过的源代码重新创建另一个。

主文件

from tkinter import *


class Application(Frame):
    def __init__(self, master=None, on_reload=None):
        Frame.__init__(self, master)
        self.pack()
        self.my_reload = Button(self)
        self.my_reload["text"] = "Reload",
        self.my_reload["command"] = on_reload
        self.my_reload.pack()
Run Code Online (Sandbox Code Playgroud)

执行器.py

import tkinter
import importlib
import main


class Executor:
    def __init__(self):
        self.root = tkinter.Tk()
        self.app = main.Application(master=self.root, on_reload=self.on_reload)
        self.app.mainloop()

    def on_reload(self):
        self.root.destroy()

        importlib.reload(main)

        self.root = tkinter.Tk()
        self.app = main.Application(master=self.root, on_reload=self.on_reload)
        self.app.mainloop()


if __name__ == '__main__':
    Executor()
Run Code Online (Sandbox Code Playgroud)