https://realpython.com/python-gui-tkinter/
'.grid()' works by splitting a window or Frame into rows and columns. You specify the location of a widget by calling .grid() and passing the row and column indices to the row and column keyword arguments, respectively. Both row and column indices start at 0.
The 'sticky' option to grid describes how the widget should line up within the grid cell.
columnspan=2 # the widged will span two columns rowspan=2 # the widged will span two rows sticky=tk.N # "n" or "N" sticky=tk.E # "e" or "E" sticky=tk.S # "s" or "S" sticky=tk.W # "w" or "W" sticky=tk.NE # "ne" or (tk.N, tk.E) sticky=tk.NW # "nw" or (tk.N, tk.W) sticky=tk.SE # "se" or (tk.S, tk.E) sticky=tk.SW # "sw" or (tk.S, tk.W) sticky=tk.EW # "ew" or (tk.E, tk.W) sticky=tk.NS # "ns" or (tk.N, tk.S) sticky=tk.NSEW # "nsew" or (tk.N, tk.S, tk.E, tk.W) +----------------+--------------+ | .grid() | .pack() | +================+==============+ | sticky=tk.NS | fill=tk.Y | +----------------+--------------+ | sticky=tk.EW | fill=tk.X | +----------------+--------------+ | sticky=tk.NSEW | fill=tk.BOTH | +----------------+--------------+
# grid1.py import tkinter as tk root = tk.Tk() for i in range(3): for j in range(3): frame = tk.Frame( master=root, relief=tk.RAISED, borderwidth=1 ) frame.grid(row=i, column=j) label = tk.Label(frame, text="Row {}\nColumn {}".format(i, j)) label.grid() root.mainloop() # run the tkinter event loop
# grid2.py import tkinter as tk root = tk.Tk() for i in range(3): # Expanding window configuration. # Every row and column has to be configured separately. root.columnconfigure(i, weight=1, minsize=75) root.rowconfigure(i, weight=1, minsize=50) for j in range(3): frame = tk.Frame( master=root, relief=tk.RAISED, borderwidth=1 ) frame.grid(row=i, column=j, padx=5, pady=5) # external padding in pixels label = tk.Label(frame, text="Row {}\nColumn {}".format(i, j)) label.grid(padx=5, pady=5) # internal padding in pixels root.mainloop() # run the tkinter event loop
# grid3.py import tkinter as tk root = tk.Tk() root.columnconfigure(0, minsize=100) # cell width root.rowconfigure(0, minsize=100) # row 0 root.rowconfigure(1, minsize=100) # row 1 label1 = tk.Label(root, text="A", bg="red") label1.grid(row=0, column=0, sticky=tk.NE) label2 = tk.Label(root, text="B", bg="blue") label2.grid(row=1, column=0, sticky=tk.SW) root.mainloop() # run the tkinter event loop
# grid4.py import tkinter as tk root = tk.Tk() root.rowconfigure(0, minsize=100) for i in range(4): root.columnconfigure(i, minsize=100) label1 = tk.Label(root, text="1", bg="black", fg="white") label2 = tk.Label(root, text="2", bg="black", fg="white") label3 = tk.Label(root, text="3", bg="black", fg="white") label4 = tk.Label(root, text="4", bg="black", fg="white") label1.grid(row=0, column=0) label2.grid(row=0, column=1, sticky=tk.EW) label3.grid(row=0, column=2, sticky=tk.NS) label4.grid(row=0, column=3, sticky=tk.NSEW) root.mainloop() # run the tkinter event loop