Tkinter columnconfigure和rowconfigure在创建新帧时未清除
我已经创建了两个不同的屏幕,我可以使用菜单按钮在它们之间切换。第一个屏幕按预期打开,而不管我选择哪个屏幕作为传递给“switch\u Frame”方法的tk.Frame。我请求帮助的问题是,当我切换到另一个帧时,看起来网格配置没有被清除,即使我使用了“grid_forget”和“destroy”。然后,当我切换回初始屏幕时,它与以前不同,因此我认为这与grid_rowconfigure和grid_columnconfigure方法有关Tkinter columnconfigure和rowconfigure在创建新帧时未清除,tkinter,frame,destroy,Tkinter,Frame,Destroy,我已经创建了两个不同的屏幕,我可以使用菜单按钮在它们之间切换。第一个屏幕按预期打开,而不管我选择哪个屏幕作为传递给“switch\u Frame”方法的tk.Frame。我请求帮助的问题是,当我切换到另一个帧时,看起来网格配置没有被清除,即使我使用了“grid_forget”和“destroy”。然后,当我切换回初始屏幕时,它与以前不同,因此我认为这与grid_rowconfigure和grid_columnconfigure方法有关 import tkinter as tk app_size
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窗口的颜色后,我终于明白了你在说什么。。我想 我将子帧的布局位置从master(tk.tk窗口)更改为self(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()
#self.frame.pack(…
:您已经对布局语句进行了注释,那么您希望如何显示框架
?是的,我通过添加“self.frame.grid”(行=0,列=0,sticky='nesw')进行了编辑'替换包。配置问题仍然存在。配置问题仍然存在:是的,您正在使用Frame
中的Frame
布局,其中您使用tk.Frame(主)在当前Frame
之外进行布局
。你真的想将这个框架
布局到主框架中吗?是的,我正在尝试在一个框架中放置多个框架。这是我用有限的Python/TKinter知识在同一屏幕上放置不同网格布局的唯一方法。我尝试提供一个更大程序的简化版本我正在研究的,在每个屏幕上有不同排列的图形、按钮和标签。是的,我正在尝试在一个框架内放置多个框架:这不回答我的问题,请回答我的问题。还可以将您的示例剥离为每个框架
一个小部件,并使用每个框架
的不同背景颜色来查看哪个帧
已移位。