Python tkinter frames do not fill parent container using Grid

Viewed 9208

I'm kind of stuck with this problem. I am trying to build an application with several pages. To that end, I create a main Frame and then I raise the frame I need in each moment. This is the code I wrote until now:

class Main(tk.Tk):

def __init__(self, *args, **kwargs):

    tk.Tk.__init__(self, *args, **kwargs)

    main_container = tk.Frame(self)
    main_container.grid(sticky = "nsew")
    main_container.grid_rowconfigure(0, weight = 1)
    main_container.grid_columnconfigure(0, weight = 1)

    menu_bar = tk.Menu(main_container)
    file_menu = tk.Menu(menu_bar, tearoff = 0) 
    file_menu.add_command(label = "Save settings", command = lambda: popupmsg("Not supported yet!"))
    file_menu.add_separator()
    file_menu.add_command(label = "Exit", command = quit)
    menu_bar.add_cascade(label = "File", menu = file_menu)

    tk.Tk.config(self, menu = menu_bar)

    self.frames = {}

    for fr in (MainPage, GraphsPage, Page2):

        frame = fr(main_container, self)

        self.frames[fr] = frame

        frame.grid(row = 0, column = 0, sticky = "nsew")

    self.show_frame(MainPage)


def show_frame(self, pointer):

    frame = self.frames[pointer]
    frame.tkraise()

Then, MainPage, for example is:

class MainPage(tk.Frame):

def __init__(self, parent, controller):

    tk.Frame.__init__(self, parent)

    #Tried this but it doesn't work
    #self.columnconfigure(0, weight = 1)
    #self.rowconfigure(0, weight = 1)
    #self.rowconfigure(1, weight = 1)
    #self.rowconfigure(2, weight = 1)
    #self.rowconfigure(3, weight = 1)

    label = tk.Label(self, text = "Main Page", font = LARGE_FONT)
    label.grid(row = 0, padx = 10, pady = 10)

    button1 = ttk.Button(self, text = "Graphs", command = lambda: controller.show_frame(GraphsPage))
    button1.grid(row = 1, sticky = 'nswe')

    button2 = ttk.Button(self, text = "Page 2", command = lambda: controller.show_frame(Page2))
    button2.grid(row = 2, sticky = 'nswe')

    button3 = ttk.Button(self, text = "Exit", command = quit)
    button3.grid(row = 3, sticky = 'nswe')

(I am not showing GraphsPage and Page 2 for simplicity). Finally, I run the program as:

app = Main()
app.geometry("1280x720")
app.mainloop()

And I am able to make the buttons fit the entire columns, but the columns do not fit the "1280x720" main container. What am I missing? Thanks in advance for your time.

2 Answers

To clarify, the reason why the GUI was not filling the entire window is because main_container (your main Tkinter object) has not been assigned a weight. In Tkinter, weight describes how much a row or column will grow if there is extra space. By default, everything in Tkinter has a weight of 0 so nothing gets resized unless you modify stuff.

Related