重复整个tkinter程序

时间:2018-08-22 14:16:30

标签: python python-3.x tkinter

按下按钮后,是否可以重复整个tkinter程序?不用按下按钮就可以做到的很酷。就像重复整个主循环一样

1 个答案:

答案 0 :(得分:1)

根据您的评论Yes, i want to restart the program,下面的代码即可做到这一点。

我认为最好将此类构建为一个类,并使用也调用外部函数的方法来管理重启。

我们要做的第一件事是destroy应用程序,然后调用一个函数来重新创建它。

只要窗口具有焦点,就可以使用Control+r或使用按钮重新启动。

import tkinter as tk


def main():
    app = MyApp()
    app.mainloop()

class MyApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        tk.Label(self, text="This is a basic app").pack()
        tk.Button(self, text="Restart", command=self.restart_app).pack()
        self.bind("<Control-r>", self.restart_app)

    def restart_app(self, event=None):
        self.destroy()
        main()


if __name__ == '__main__':
    main()

正如布莱恩·奥克利(Bryan Oakley)在评论中指出的那样,应用程序中经常会有全局变量,这些变量在您重新创建应用程序后将继续存在。如果是这种情况,则需要确保将这些变量也重置为其默认状态,或者可以将它们移到该类中以确保在重新创建应用程序时自动完成此操作。

以下是使用全局变量时可能发生的情况的示例。

在此示例中,我们有一个名为my_name的全局变量,您可以在应用程序中更改此变量。重新启动后,该名称不会重置为默认名称,而是保留更改后的名称。

import tkinter as tk


my_name = "Mike"

def main():
    app = MyApp()
    app.mainloop()

class MyApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.lbl = tk.Label(self, text="This is a basic app written by {}".format(my_name))
        self.lbl.pack()
        self.entry = tk.Entry(self)
        self.entry.pack()

        tk.Button(self, text="Set new name!", command=self.set_new_name).pack()
        tk.Button(self, text="Restart", command=self.restart_app).pack()
        self.bind("<Control-r>", self.restart_app)

    def set_new_name(self):
        global my_name
        my_name = self.entry.get()
        self.lbl.config(text="This is a basic app written by {}".format(my_name))

    def restart_app(self, event=None):
        self.destroy()
        main()

if __name__ == '__main__':
    main()