创建新框架时不清除列配置和行配置

问题描述 投票:-1回答:1

我创建了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()
tkinter frame destroy
1个回答
0
投票

起初,您的评论@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()
© www.soinside.com 2019 - 2024. All rights reserved.