0

I have the menu frame on the left side and the main container on the right side but when I fire it up I only see them in a small box inside the main window.

How can I make the frames fit the window no matter what size it is?

enter image description here

Code:

class GUI(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.title("GUI Project")
        # self.resizable(0, 0)
        menu = tk.Frame(self, relief="solid")
        container = tk.Frame(self, relief="ridge")
        menu.grid(row=0, column=0, rowspan=4, sticky="nsew")
        container.grid(row=0, column=1, sticky="nsew")
        menu.grid_rowconfigure(0, weight=1)
        container.rowconfigure(0, weight=0)
        container.columnconfigure(1, weight=0)

        self.frames = ["Menu", "FutureFeature2", "TestPing", "FutureFeature3", "FutureFeature"]

        self.frames[0] = Menu(parent=menu, controller=self)
        self.frames[1] = FutureFeature2(parent=container, controller=self)
        self.frames[2] = TestPing(parent=container, controller=self)
        self.frames[3] = FutureFeature3(parent=container, controller=self)
        self.frames[4] = FutureFeature(parent=container, controller=self)

        self.frames[0].grid(row=0, column=0, sticky="nsew")
        self.frames[1].grid(row=0, column=0, sticky="nsew")
        self.frames[2].grid(row=0, column=0, sticky="nsew")
        self.frames[3].grid(row=0, column=0, sticky="nsew")
        self.frames[4].grid(row=0, column=0, sticky="nsew")

        self.show_frame(1)

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        print(frame)
        frame.tkraise()
        frame.grid(row=0, column=0, columnspan=5, rowspan=5, sticky="nsew")

class Menu(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller

        button1 = tk.Button(self, text="Ping Test", bg="royalblue2",
                            command=lambda: controller.show_frame(2))
        button2 = tk.Button(self, text="FutureFeature", bg="dark violet",
                            command=lambda: controller.show_frame(4))
        buttun3 = tk.Button(self, text="FutureFeature", bg="pale goldenrod",
                            command=lambda: controller.show_frame(1))
        button4 = tk.Button(self, text="Quit", bg="gray40",
                            command=lambda: self.terminate())

        button1.pack(fill="both", expand=True)
        button2.pack(fill="both", expand=True)
        buttun3.pack(fill="both", expand=True)
        button4.pack(fill="both", expand=True)

    def terminate(self):

        path = fr'c:/users/{os.getlogin()}/desktop/Gui-Skeleton'

        try:
            os.rmdir(path)
        except OSError as err:
            print(f"Error Deleting tmp folder! {err}")

        exit()

if __name__ == "__main__":

    path = fr'c:/users/{os.getlogin()}/desktop/Gui-Skeleton'

    try:
        if os.path.isdir(path):
            pass
        else:
            os.mkdir(path)

    except OSError as err:
        print(f"[!] Operation failed! {err}")

    app = GUI()
    app.geometry("800x600")
    app.mainloop()

.....................................................................................................................................................................................................................................................................................

Gilush
  • 81
  • 8

1 Answers1

2

The specific problem that you're asking about is due to the fact you are putting menu and container in the root window using grid but you haven't given any rows or columns in the root window a weight. Therefore, both menu and grid will use as little space as necessary.

A general rule of thumb is that when you use grid, you should give at least one row and one column a positive weight so that there is no unused space. You are failing to do that in the root window. For more information on grid weights see What does 'weight' do in tkinter?

The solution is simple: make sure that you've given at least one row and one column a positive weight in the root window:

self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(1, weight=1)

That being said, I would recommend using pack for menu and container since they are the only widgets directly in the root window. pack is generally better than grid when laying out widgets in row or column, if for no other reason that you don't have to take the extra step of assigning weights.

menu.pack(side="left", fill="y")
container.pack(side="right", fill="both", expand=True)
Bryan Oakley
  • 370,779
  • 53
  • 539
  • 685