从Toplevel销毁根窗口

1 投票
1 回答
1585 浏览
提问于 2025-04-18 16:08

我正在用tkinter写一个多窗口的图形界面程序。下面的代码是我主要部分的布局。第一个窗口运行得很好,但当我通过调用self.next_win进入第二个窗口时,情况就有点奇怪了。

主要的问题是,当我想关闭整个图形界面时,我希望每个窗口都有一个退出按钮,按下后可以关闭整个程序(也就是调用root.destroy)。在第一个窗口,这个功能正常,我调用self.quit方法就可以了;但是在第二个窗口,这个方法就不管用了。我知道这是因为第二个窗口的master是一个Toplevel小部件,但我不太确定该怎么解决这个问题。我看不出如何从第二个窗口调用root.destroy

我该如何解决这个问题呢?是不是可以在SecondWin.quit方法里加一行代码,或者换个更好的代码结构,让这个问题变得简单(请记住,我是个初学者,所以简单的东西也需要解释)?谢谢。

class FirstWin:
    def __init__(self, master):
        self.master = master
        ...

    ...

    def next_win(self):
        self.master.withdraw()
        root2 = Toplevel()
        SecondWin(root2)

    def quit(self):
        self.master.destroy()

class SecondWin:
    def __init__(self, master):
        self.master = master
        ...

    ...

    def quit(self):
        self.master.destroy() # What goes in here?

...

def main():
    root = Tk()
    GUI = FirstWin(root)
    root.mainloop()

if __name__ == '__main__':
    main()

1 个回答

1

你只需要告诉SecondWin哪个是根窗口,它就能把它销毁。

...
    root2 = Toplevel()
    # tell the second window what the master is,
    # and also tell it to be a child of FirstWin.
    SecondWin(self.master, root2)
...

class SecondWin():
    def __init__(self, root, master):
        # root is the root window, master is the parent of this window
        self.root = root
        self.master = master
        <other initialization code here>

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

撰写回答