Tkinter新窗口无法正常关闭

时间:2016-08-30 11:21:28

标签: python python-2.7 tkinter

我希望我的GUI有一个新窗口'选项与第一个选项相同。

问题是它还有一个退出(退出)按钮,它不会按预期工作 - 每当我打开新窗口然后按下按钮,在第一次点击时没有任何反应,在第二次它会关闭两个窗口(如果有3个窗口打开,那么它会在第三次点击时关闭所有内容,等等。)

这是相关代码:

from Tkinter import *
from ttk import *


class Application(Tk):
    def __init__(self):
        self.root = Tk()
        self.root.geometry("250x150")
        self.app = Frame(self.root)
        self.app.grid()
        self.create_menu()
        self.create_widgets()
        self.root.mainloop()

    def create_menu(self):
        menu = Menu(self.root)
        self.root.config(menu=menu)
        sub_menu = Menu(menu)
        menu.add_cascade(label="File", menu=sub_menu)
        sub_menu.add_command(label="New", command=self.__init__)
        sub_menu.add_command(label="Run", command=self.enter)
        sub_menu.add_separator()
        sub_menu.add_command(label="Exit", command=self.app.quit)

我也试图改变:

sub_menu.add_command(label="New", command=self.__init__)

为:

sub_menu.add_command(label="New", command=self.new window)

其中:

def new_window(self):
    class App(Application):
        Application.__init__(self)

两者都做同样的事情。

我该如何解决?

1 个答案:

答案 0 :(得分:1)

在Tkinter-Application中,可能只有一个Tk对象。如果垃圾收集器销毁或销毁了该对象,则将禁用Tkinter。而是将Toplevel用于其他窗口。

请改为尝试:

from Tkinter import *
from ttk import *


class Application(object):
    def __init__(self, master):
        self.root = master
        self.root.geometry("250x150")
        self.app = Frame(self.root)
        self.app.grid()
        self.create_menu()
        self.create_widgets()

    def create_menu(self):
        menu = Menu(self.root)
        self.root.config(menu=menu)
        sub_menu = Menu(menu)
        menu.add_cascade(label="File", menu=sub_menu)
        sub_menu.add_command(label="New", command=self.new)
        sub_menu.add_command(label="Run", command=self.enter)
        sub_menu.add_separator()
        sub_menu.add_command(label="Exit", command=self.quit)

    def new(self):
        window = Toplevel(tk)
        return Application(window)

    def quit(self):
        tk.destroy()

tk = Tk()
Application(tk)
tk.mainloop()