我创建了2个不同的屏幕,可以使用菜单按钮进行切换。无论我选择将tk.Frame传递给'switch_frame'方法的屏幕如何,第一个屏幕都会按预期打开。我需要协助的问题是,即使我使用的是'grid_forget'和'destroy',当我切换到另一帧时,网格配置仍未清除。然后,当我切换回初始屏幕时,它与之前的屏幕不一样,因此为什么我认为这与grid_rowconfigure和grid_columnconfigure方法有关。
import tkinter as tk
app_size = "800x600"
class NewController(tk.Tk):#child of tkinter class
def __init__ (self):
tk.Tk.__init__(self)
self.title('Controller')
self.frame = None
self.switch_frame(Screen2)
def switch_frame(self, frame_class): #function to allow switching between screens
global screen_flag
if self.frame is not None: #check if there is an existing frame existing
self.frame.destroy() #remove existing frame/close window
new_frame = frame_class(self) #create new frame of passed tk frame and self being the tk.TK
self.frame = new_frame
self.frame.grid(row=0, column=0, sticky='nesw',)
self.focus_force()
class Screen1(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.colour = 'white'
self.configure(bg = self.colour)
master.geometry(app_size)
#master.grid_forget()
master.grid_rowconfigure(0, weight=1)# Configure main root frame so that it can resize
master.grid_columnconfigure(0, weight=1)# Configure main root frame so that it can resize
master.grid_rowconfigure(1, weight=5)# Configure main root frame so that it can resize
#Configure Frame 1
self.menu_top = tk.Frame(master)#create frame 1
self.menu_top.grid(row=0, column=0, sticky='nesw', padx=1, pady=1) #locate frame 1 on root grid
for x in range(5):
self.menu_top.grid_columnconfigure(x, weight=1)
self.menu_top.grid_rowconfigure(0, weight=1)
#Configure Frame 2
self.bottom_area = tk.Frame(master, bg="#fffaaa") #create frame 2
self.bottom_area.grid(row=1, column=0, sticky='nesw', padx=1, pady=1) #locate frame 2 on root grid
for x in range(3):
self.bottom_area.grid_columnconfigure(x, weight=1)
self.bottom_area.grid_rowconfigure(0, weight=1)
self.widgets(master)
def widgets(self, master):
# Create widgets
#Configure the grid in the menu_top Frame
menu_button1 = tk.Button(self.menu_top, text="Menu 1", command= lambda: self.closeframes(master, Screen1))
menu_button2 = tk.Button(self.menu_top, text="Menu 2", command= lambda: self.closeframes(master, Screen2))
menu_button3 = tk.Button(self.menu_top, text="Menu 3", command=self.buttonpress)
menu_button4 = tk.Button(self.menu_top, text="Menu 4", command=self.buttonpress)
menu_button5 = tk.Button(self.menu_top, text="Menu 5", command=self.buttonpress)
menu_button1.grid(row=0, column=0, sticky='nesw', padx=1, pady=1)
menu_button2.grid(row=0, column=1, sticky='nesw', padx=1, pady=1)
menu_button3.grid(row=0, column=2, sticky='nesw', padx=1, pady=1)
menu_button4.grid(row=0, column=3, sticky='nesw', padx=1, pady=1)
menu_button5.grid(row=0, column=4, sticky='nesw', padx=1, pady=1)
#Configure the grid in the bottom_area Frame
menu_button1 = tk.Button(self.bottom_area, text="Menu 1", command=self.buttonpress)
menu_button2 = tk.Button(self.bottom_area, text="Menu 2", command=self.buttonpress)
menu_button3 = tk.Button(self.bottom_area, text="Menu 3", command=self.buttonpress)
menu_button1.grid(row=0, column=0, sticky='nesw', padx=1, pady=1)
menu_button2.grid(row=0, column=1, sticky='nesw', padx=1, pady=1)
menu_button3.grid(row=0, column=2, sticky='nesw', padx=1, pady=1)
#function used to get and set all information from entry fields at once
def closeframes(self, master, next_screen):
self.menu_top.grid_forget()
self.bottom_area.grid_forget()
list = master.grid_slaves()
for l in list:
l.destroy()
master.switch_frame(next_screen)
def buttonpress(self):
print ("click!")
class Screen2(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.colour = 'white'
self.configure(bg = self.colour)
master.geometry(app_size)
master.grid_rowconfigure(0, weight=1)# Configure main root frame so that it can resize
master.grid_columnconfigure(0, weight=1)# Configure main root frame so that it can resize
master.grid_columnconfigure(1, weight=1)# Configure main root frame so that it can resize
#Configure Frame 1
self.left_area = tk.Frame(master)#create frame 1
self.left_area.grid(row=0, column=0, sticky='nesw', padx=1, pady=1) #locate frame 1 on root grid
for x in range(5):
self.left_area.grid_rowconfigure(x, weight=1)
self.left_area.grid_columnconfigure(0, weight=1)
#Configure Frame 2
self.right_area = tk.Frame(master, bg="#fffaaa") #create frame 2
self.right_area.grid(row=0, column=1, sticky='nesw', padx=1, pady=1) #locate frame 2 on root grid
for x in range(3):
self.right_area.grid_rowconfigure(x, weight=1)
self.right_area.grid_columnconfigure(0, weight=1)
self.widgets(master)
def widgets(self, master):
# Create widgets
#Configure the grid in the left_area Frame
left_button1 = tk.Button(self.left_area, text="left 1", command=lambda: self.closeframes(master, Screen1))
left_button2 = tk.Button(self.left_area, text="left 2", command=lambda: self.closeframes(master, Screen2))
left_button3 = tk.Button(self.left_area, text="left 3", command=self.buttonpress)
left_button4 = tk.Button(self.left_area, text="left 4", command=self.buttonpress)
left_button5 = tk.Button(self.left_area, text="left 5", command=self.buttonpress)
left_button1.grid(row=0, column=0, sticky='nesw', padx=1, pady=1)
left_button2.grid(row=1, column=0, sticky='nesw', padx=1, pady=1)
left_button3.grid(row=2, column=0, sticky='nesw', padx=1, pady=1)
left_button4.grid(row=3, column=0, sticky='nesw', padx=1, pady=1)
left_button5.grid(row=4, column=0, sticky='nesw', padx=1, pady=1)
#Configure the grid in the right_area Frame
right_button1 = tk.Button(self.right_area, text="right 1", command=self.buttonpress)
right_button2 = tk.Button(self.right_area, text="right 2", command=self.buttonpress)
right_button3 = tk.Button(self.right_area, text="right 3", command=self.buttonpress)
right_button1.grid(row=0, column=0, sticky='nesw', padx=1, pady=1)
right_button2.grid(row=1, column=0, sticky='nesw', padx=1, pady=1)
right_button3.grid(row=2, column=0, sticky='nesw', padx=1, pady=1)
def buttonpress(self):
print ("click!")
def closeframes(self, master, next_screen):
master.frame.grid_forget()
self.right_area.grid_forget()
self.left_area.grid_forget()
list = master.grid_slaves()
for l in list:
l.destroy()
master.frame.destroy()
master.switch_frame(next_screen)
Controller = NewController()
Controller.mainloop()
起初,您的评论@stovfl对我来说毫无意义,但在您根据您的建议更改了框架的颜色以及tk窗口后,我终于明白了您在说什么..我认为..
[我将子帧的放置位置从主(tk.TK窗口)更改为自身(tk.Frame)。
我还将行和列配置放在tk窗口上,以便每个屏幕框架都将填充tk窗口。
我希望这段代码对其他人有帮助。
import Tkinter as tk
app_size = "800x600"
class NewController(tk.Tk):
def __init__ (self):
tk.Tk.__init__(self)
self.title('Controller')
self.frame = None
self.switch_frame(Screen2)
def switch_frame(self, frame_class): #function to allow switching between screens
if self.frame is not None: #check if there is an existing frame existing
self.frame.destroy() #remove existing frame/close window
self.geometry(app_size)
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
self.frame = frame_class(self) #create new frame of passed tk frame and self being the tk.TK
self.focus_force()
class Screen1(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.config(bg="green", borderwidth=10, relief="sunken")
self.grid(row=0, column=0, sticky='nesw', padx=1, pady=1)
self.rowconfigure(0, weight=1)
self.rowconfigure(1, weight=1)
self.columnconfigure(0, weight=1)
#Configure Frame 1
self.menu_top = tk.Frame(self, bg="blue")#create frame 1
self.menu_top.grid(row=0, column=0, sticky='nesw', padx=1, pady=1) #locate frame 1 on master frame
for x in range(5):
self.menu_top.grid_columnconfigure(x, weight=1)
self.menu_top.grid_rowconfigure(0, weight=1)
#Configure Frame 2
self.bottom_area = tk.Frame(self, bg="pink") #create frame 2
self.bottom_area.grid(row=1, column=0, sticky='nesw', padx=1, pady=1) #locate frame 2 master frame
for x in range(3):
self.bottom_area.grid_columnconfigure(x, weight=1)
self.bottom_area.grid_rowconfigure(0, weight=1)
self.widgets(master)
def widgets(self, master):
# Create widgets
#Configure the grid in the menu_top Frame
menu_button1 = tk.Button(self.menu_top, text="Menu 1", command= lambda: master.switch_frame(Screen1))
menu_button2 = tk.Button(self.menu_top, text="Menu 2", command= lambda: master.switch_frame(Screen2))
menu_button3 = tk.Button(self.menu_top, text="Menu 3", command=self.buttonpress)
menu_button4 = tk.Button(self.menu_top, text="Menu 4", command=self.buttonpress)
menu_button5 = tk.Button(self.menu_top, text="Menu 5", command=self.buttonpress)
menu_button1.grid(row=0, column=0, sticky='nesw', padx=1, pady=1)
menu_button2.grid(row=0, column=1, sticky='nesw', padx=1, pady=1)
menu_button3.grid(row=0, column=2, sticky='nesw', padx=1, pady=1)
menu_button4.grid(row=0, column=3, sticky='nesw', padx=1, pady=1)
menu_button5.grid(row=0, column=4, sticky='nesw', padx=1, pady=1)
#Configure the grid in the bottom_area Frame
menu_button1 = tk.Button(self.bottom_area, text="Menu 1", command=self.buttonpress)
menu_button2 = tk.Button(self.bottom_area, text="Menu 2", command=self.buttonpress)
menu_button3 = tk.Button(self.bottom_area, text="Menu 3", command=self.buttonpress)
menu_button1.grid(row=0, column=0, sticky='nesw', padx=1, pady=1)
menu_button2.grid(row=0, column=1, sticky='nesw', padx=1, pady=1)
menu_button3.grid(row=0, column=2, sticky='nesw', padx=1, pady=1)
def buttonpress(self):
print ("click!")
class Screen2(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.config(bg="green", borderwidth=10, relief="sunken")
self.grid(row=0, column=0, sticky='nesw', padx=1, pady=1)
self.rowconfigure(0, weight=1)
self.columnconfigure(0, weight=1)
self.columnconfigure(1, weight=1)
#Configure Frame 1
self.left_area = tk.Frame(self, bg="red", borderwidth=5)#create frame 1
self.left_area.grid(row=0, column=0, sticky='nesw', padx=1, pady=1) #locate frame 1 on root grid
for x in range(5):
self.left_area.grid_rowconfigure(x, weight=1)
self.left_area.grid_columnconfigure(0, weight=1)
#Configure Frame 2
self.right_area = tk.Frame(self, bg="yellow", borderwidth=5) #create frame 2
self.right_area.grid(row=0, column=1, sticky='nesw', padx=1, pady=1) #locate frame 2 on root grid
for x in range(3):
self.right_area.grid_rowconfigure(x, weight=1)
self.right_area.grid_columnconfigure(0, weight=1)
self.widgets(master)
def widgets(self, master):
# Create widgets
#Configure the grid in the left_area Frame
left_button1 = tk.Button(self.left_area, text="left 1", command=lambda: master.switch_frame(Screen1))
left_button2 = tk.Button(self.left_area, text="left 2", command=lambda: master.switch_frame(Screen2))
left_button3 = tk.Button(self.left_area, text="left 3", command=self.buttonpress)
left_button4 = tk.Button(self.left_area, text="left 4", command=self.buttonpress)
left_button5 = tk.Button(self.left_area, text="left 5", command=self.buttonpress)
left_button1.grid(row=0, column=0, sticky='nesw', padx=1, pady=1)
left_button2.grid(row=1, column=0, sticky='nesw', padx=1, pady=1)
left_button3.grid(row=2, column=0, sticky='nesw', padx=1, pady=1)
left_button4.grid(row=3, column=0, sticky='nesw', padx=1, pady=1)
left_button5.grid(row=4, column=0, sticky='nesw', padx=1, pady=1)
#Configure the grid in the right_area Frame
right_button1 = tk.Button(self.right_area, text="right 1", command=self.buttonpress)
right_button2 = tk.Button(self.right_area, text="right 2", command=self.buttonpress)
right_button3 = tk.Button(self.right_area, text="right 3", command=self.buttonpress)
right_button1.grid(row=0, column=0, sticky='nesw', padx=1, pady=1)
right_button2.grid(row=1, column=0, sticky='nesw', padx=1, pady=1)
right_button3.grid(row=2, column=0, sticky='nesw', padx=1, pady=1)
def buttonpress(self):
print ("click!")
Controller = NewController()
Controller.mainloop()