How to horizontally center a widget using grid()? How to horizontally center a widget using grid()? tkinter tkinter

How to horizontally center a widget using grid()?


There's no trick -- the widget is centered in the area allocated to it by default. Simply place a label in a cell without any sticky attributes and it will be centered.

Now, the other question is, how to get the area it is allocated to be centered. That depends on many other factors, such as what other widgets are there, how they are arranged, etc.

Here's a simple example showing a single centered label. It does this by making sure the row and column it is in takes up all extra space. Notice that the label stays centered no matter how big you make the window.

import Tkinter as tkclass Example(tk.Frame):    def __init__(self, parent):        tk.Frame.__init__(self, parent)        label = tk.Label(self, text="This should be centered")        label.grid(row=1, column=1)        self.grid_rowconfigure(1, weight=1)        self.grid_columnconfigure(1, weight=1)if __name__ == "__main__":    root = tk.Tk()    Example(root).grid(sticky="nsew")    root.grid_rowconfigure(0, weight=1)    root.grid_columnconfigure(0, weight=1)    root.mainloop()

You can get a similar effect by giving a weight to all rows and columns except the one with the label.

import Tkinter as tkclass Example(tk.Frame):    def __init__(self, parent):        tk.Frame.__init__(self, parent)        label = tk.Label(self, text="This should be centered")        label.grid(row=1, column=1)        self.grid_rowconfigure(0, weight=1)        self.grid_rowconfigure(2, weight=1)        self.grid_columnconfigure(0, weight=1)        self.grid_columnconfigure(2, weight=1)if __name__ == "__main__":    root = tk.Tk()    Example(root).grid(sticky="nsew")    root.grid_rowconfigure(0, weight=1)    root.grid_columnconfigure(0, weight=1)    root.mainloop()


There is nothing special required. A widget will be in the middle of it's parent automatically. What is required to to tell the parent to fill all available space.

from tkinter import *root = Tk()root.geometry("500x500+0+0")frmMain = Frame(root,bg="blue")startbutton = Button(frmMain, text="Start",height=1,width=4)startbutton.grid()#Configure the row/col of our frame and root window to be resizable and fill all available spacefrmMain.grid(row=0, column=0, sticky="NESW")frmMain.grid_rowconfigure(0, weight=1)frmMain.grid_columnconfigure(0, weight=1)root.grid_rowconfigure(0, weight=1)root.grid_columnconfigure(0, weight=1)root.mainloop()

This uses grid rather than pack to place the widgets and the grid is configured to fill the entire size of the window. The button will appear in the centre regardless of the size of the window.


This worked for me:

    lbl1 = Label(self, text='some text')         lbl1.grid(row=1, column=1, sticky='e')  # right aligned    # sticky='w'  # left aligned    # sticky=''  # centered (or no sticky)