2016-02-24 4 views
2

У меня есть программа, которую я редактирую бесконечно, и каждый раз, когда я вношу изменения, мне нужно снова выйти и перезапустить. Я хотел бы иметь возможность перезагружать и перезапускать без необходимости выходить и снова возвращаться.Как я могу повторно выполнить мою программу Python, нажав кнопку

Вот простая программа, в файл под названием 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() 

Я экспериментировал с использованием пересылки всего класса Application с:

def do_load(self): 
    print("time to reload") 
    reload(Application) 

и я получаю сообщение об ошибке:

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

это ли это случай RTFM где п чтобы узнать больше о модулях?

Любая помощь или предложения будут с радостью приняты.

ответ

3

Для использования importlib здесь вам необходимо перезагрузить основной модуль и убить экземпляр TK, чтобы python смог восстановить новый, с отредактированным исходным кодом.

main.py

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() 

executor.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() 
Смежные вопросы