Search code examples
pythontkintertkinter-layout

Button changes frame size in Tkinter


I'm new to Tkinter, and have a problem with my frames when adding widgets. In this example, I add a button which makes my frame wider when I place the button inside it with .grid().

How can I make the frame "fixed"? I want the blue frame in the code below to keep the same width when I add the button.

Thanks in advance.

Regards, Laphroaig


class Window(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master = master
        master.title("Yatzy - The Game")
        master.geometry("800x600+0+0")
        master.iconbitmap(r'dice.ico')
        master.state('zoomed')

        # Create grid index for the window
        for r in range(20):
            self.master.rowconfigure(r, weight=1)

        for c in range(20):
            self.master.columnconfigure(c, weight=1)


        # Place Frame 1
        Frame1 = Frame(master, bg="blue")
        Frame1.grid(row = 0, column = 0, rowspan = 20, columnspan = 3, sticky=W+E+N+S)

        # Place Frame 2
        Frame2 = Frame(master, bg="green")
        Frame2.grid(row=0, column=3, rowspan=20, columnspan=17, sticky = W+E+N+S)

        # Place Frame 3
        Frame3 = Frame(master, bg="red")
        Frame3.grid(row=5, column=8, rowspan=10, columnspan=7, sticky = W+E+N+S)

        # Place button 1
        btn_1 = Button(master, text="hello123")
        btn_1.grid(row=0, column=0)


root = Tk()
app = Window(master=root)
app.mainloop()


Solution

  • You can stop content from affecting the size of a Frame with grid_propagate(False). See example below.

    Other things; You inherit from Frame but never put anything inside self, instead you put everything inside self.master ie. root. I changed to put everything in self and then pack self within root.

    I also removed the icon as I don't have your icon file.

    from tkinter import *
    
    class Window(Frame):
    
        def __init__(self, master=None):
            Frame.__init__(self, master)
            self.master = master
            master.title("Yatzy - The Game")
            master.geometry("800x600+0+0")
            master.state('zoomed')
            self.pack(expand=True, fill='both')
    
            # Create grid index for the window
            for r in range(20):
                self.rowconfigure(r, weight=1)
    
            for c in range(20):
                self.columnconfigure(c, weight=1)
    
    
            # Place Frame 1
            Frame1 = Frame(self, bg="blue")
            Frame1.grid(row = 0, column = 0, rowspan = 20, columnspan = 3, sticky=W+E+N+S)
            Frame1.grid_propagate(False) # Stop grid() from resizing container
    
            # Place Frame 2
            Frame2 = Frame(self, bg="green")
            Frame2.grid(row=0, column=3, rowspan=20, columnspan=17, sticky = W+E+N+S)
    
            # Place Frame 3
            Frame3 = Frame(self, bg="red")
            Frame3.grid(row=5, column=8, rowspan=10, columnspan=7, sticky = W+E+N+S)
    
            # Place button 1
            btn_1 = Button(Frame1, text="hello123")
            btn_1.grid(row=0, column=0)
    
    
    root = Tk()
    app = Window(master=root)
    app.mainloop()