我已经尝试了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”按钮需要通过一些我无法弄清楚的命令退出整个程序。
感谢您提供任何帮助。
答案 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,我们会更容易帮助您。否则,我们需要花时间搞清楚我们需要添加什么?在我们甚至可以运行之前从您的代码中删除。