Tkinter columnconfigure和rowconfigure在创建新帧时未清除

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

我已经创建了两个不同的屏幕,我可以使用菜单按钮在它们之间切换。第一个屏幕按预期打开,而不管我选择哪个屏幕作为传递给“switch\u Frame”方法的tk.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窗口的颜色后,我终于明白了你在说什么。。我想

我将子帧的布局位置从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知识在同一屏幕上放置不同网格布局的唯一方法。我尝试提供一个更大程序的简化版本我正在研究的,在每个屏幕上有不同排列的图形、按钮和标签。是的,我正在尝试在一个框架内放置多个框架:这不回答我的问题,请回答我的问题。还可以将您的示例剥离为每个
框架
一个小部件,并使用每个
框架
的不同背景颜色来查看哪个
已移位。