如何让这个按钮退出tkinter中的父窗口?

时间:2018-04-25 10:37:06

标签: python python-3.x tkinter

我已经尝试了2天才能让这个工作没有运气。我已经尝试了在相关问题上找到的所有方法 - destroy,quit,sys.exit ......没有任何工作。问题是我的代码似乎是以略微不同的方式编写的,而tkinter代码通常是在SO上编写的,因为我在主类的顶部为每个窗口使用一个单独的类。因此,我很难看到类似问题中使用的“根”变量对应于我的代码(常见的建议是“command = root.quit”或类似)。但是,我确信代码的结构很好(应用程序运行正常),因为我从sentdex的“使用Python的Tkinter GUI中的多个Windows /帧”视频复制了基本框架。

代码如下,删除了“StartPage”的不相关部分。还有“PageOne”和“PageTwo”,不包括在内,与StartPage非常相似。我将在这两页上需要相同的按钮。

主类中的for循环和show_frame方法用于通过按钮在帧之间切换。一切正常。

class testApp(tk.Tk):

def __init__(self, *args, **kwargs):

    tk.Tk.__init__(self, *args, **kwargs)

    container = tk.Frame(self)

    container.pack(side="top", fill="both", expand = True)


    self.frames = {}

    for F in (StartPage, PageOne, PageTwo):

        frame = F(container, self)

        self.frames[F] = frame

        frame.grid(row=0, column=0, sticky="nsew")

    self.show_frame(StartPage)

def show_frame(self, cont):

    frame = self.frames[cont]
    frame.tkraise()





class StartPage(tk.Frame):

def __init__(self, parent, controller):

    tk.Frame.__init__(self,parent)

    ...

    confirmFrame = tk.Frame(self)
    confirmFrame.pack()

    ... 

    self.buttonNo = tk.Button(confirmFrame, text="No, quit the program",
                        command=????)
    self.buttonNo.pack()

app = testApp()
app.mainloop()

为了完全清晰,那么,StartPage中的“buttonNo”按钮需要通过一些我无法弄清楚的命令退出整个程序。

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:1)

我知道两种方式:

要获取顶层(您的窗口),请使用self.winfo_toplevel(),以便self.winfo_toplevel().quit()结束您的申请。

不太好用的是使用私有函数的self._root().quit()(请参阅_root上的前导下划线),因此可能会在没有警告的情况下进行更改。

答案 1 :(得分:0)

您的testApp继承自tk.Tk,因此它成为了根。它将作为controller arg传递,因此您的帧可以使用该名称来访问它。这是一个源自您的代码的快速演示。

import tkinter as tk

class testApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)

        self.frames = {}
        for F in (StartPage,):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(StartPage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        confirmFrame = tk.Frame(self)
        confirmFrame.pack()

        self.buttonNo = tk.Button(confirmFrame, text="No, quit the program",
                            command=controller.quit)
        self.buttonNo.pack()

app = testApp()
app.mainloop()
顺便说一句,如果您发布MCVE,我们会更容易帮助您。否则,我们需要花时间搞清楚我们需要添加什么?在我们甚至可以运行之前从您的代码中删除。