所以我写了在2帧之间切换的代码,我尝试了destroy()方法,但没有错误,但是当我单击按钮时,该帧无法正确破坏
import tkinter as tk
from tkinter import font as tkfont
class SampleApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self._frame = None
self.switch_frame(StartPage)
def switch_frame(self, frame_class):
new_frame = frame_class(self)
if self._frame is not None:
self._frame.destroy()
self._frame = new_frame
self._frame.pack()
class StartPage(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self = tk.Frame(master,width=1200,height=700)
self.pack()
self.create_button = tk.Button(self,text='CREATE +',command=lambda: master.switch_frame(Create_list),width=15,height=2) # =lambda: master.switch_frame(Create_list)
self.create_button.place(x=100,y=300)
class Create_list(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self = tk.Frame(master,width=1200,height=700)
self.pack()
tk.Label(self, text="Page one", font=('Helvetica', 18, "bold")).pack(side="top", fill="x", pady=5)
tk.Button(self, text="Go back to start page",
command=lambda: master.switch_frame(StartPage)).pack()
if __name__ == "__main__":
app = SampleApp()
app.mainloop()
这是结果,如您所见,当我单击“创建”按钮时,它不会销毁,但会在下面显示新框架:
答案 0 :(得分:0)
问题是您将self
重新定义为master
中而不是页面本身中的框架。您永远不要以这种方式重新定义self
。发生的情况是您破坏了页面,但是所有小部件都在第二帧中。第二帧位于主框架中,因此销毁页面时不会销毁它。
如果您确实想将“页面”视为对象,则在“页面”中创建的每个小部件都必须是self
的子代或其子代之一。
与该问题无关,您正在使用place
。 place
不会导致包含框架的增大或缩小。除非有非常令人信服的理由使用place
,否则应使用pack
或grid
。如果您确实使用place
,则要由您为包含的小部件设置合理的大小。
以下示例显示了创建页面的正确方法。请注意,它不会不重新定义self
,而是将所有内容直接放入真实的 self 中。另外,它使用pack
而不是place
。
class StartPage(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.create_button = tk.Button(self,text='CREATE +',
command=lambda: master.switch_frame(Create_list),
width=15,height=2)
self.create_button.pack(side="top")
此外,打包框架时,您可能应该使用适当的选项,以使其充满窗口:
self._frame.pack(fill="both", expand=True)