Tkinter has three mechanisms for geometry management: place
, pack
, and grid
.
The place
manager uses absolute pixel coordinates.
The pack
manager places widgets into one of 4 sides. New widgets are placed next to existing widgets.
The grid
manager places widgets into a grid similar to a dynamically resizing spreadsheet.
The most common keyword arguments for widget.place
are as follows:
x
, the absolute x-coordinate of the widgety
, the absolute y-coordinate of the widgetheight
, the absolute height of the widgetwidth
, the absolute width of the widgetA code example using place
:
class PlaceExample(Frame):
def __init__(self,master):
Frame.__init__(self,master)
self.grid()
top_text=Label(master,text="This is on top at the origin")
#top_text.pack()
top_text.place(x=0,y=0,height=50,width=200)
bottom_right_text=Label(master,text="This is at position 200,400")
#top_text.pack()
bottom_right_text.place(x=200,y=400,height=50,width=200)
# Spawn Window
if __name__=="__main__":
root=Tk()
place_frame=PlaceExample(root)
place_frame.mainloop()
widget.pack
can take the following keyword arguments:
expand
, whether or not to fill space left by parentfill
, whether to expand to fill all space (NONE (default), X, Y, or BOTH)side
, the side to pack against (TOP (default), BOTTOM, LEFT, or RIGHT)The most commonly used keyword arguments of widget.grid
are as follows:
row
, the row of the widget (default smallest unoccupied)rowspan
, the number of colums a widget spans (default 1)column
, the column of the widget (default 0)columnspan
, the number of columns a widget spans (default 1)sticky
, where to place widget if the grid cell is larger than it (combination of N,NE,E,SE,S,SW,W,NW)The rows and columns are zero indexed. Rows increase going down, and columns increase going right.
A code example using grid
:
from tkinter import *
class GridExample(Frame):
def __init__(self,master):
Frame.__init__(self,master)
self.grid()
top_text=Label(self,text="This text appears on top left")
top_text.grid() # Default position 0, 0
bottom_text=Label(self,text="This text appears on bottom left")
bottom_text.grid() # Default position 1, 0
right_text=Label(self,text="This text appears on the right and spans both rows",
wraplength=100)
# Position is 0,1
# Rowspan means actual position is [0-1],1
right_text.grid(row=0,column=1,rowspan=2)
# Spawn Window
if __name__=="__main__":
root=Tk()
grid_frame=GridExample(root)
grid_frame.mainloop()
Never mix pack
and grid
within the same frame! Doing so will lead to application deadlock!