100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Programming

Layout with pack, grid, and place

How Tk's three geometry managers—pack, grid, and place—control widget positioning and sizing, and when to use each.

Tk GUI BasicsIntermediate10 min readJul 10, 2026
Analogies

Tk's Three Geometry Managers

Simply creating a widget with button .b -text OK allocates it in memory and registers it in the widget tree, but it will not appear on screen until you hand it to a geometry manager—pack, grid, or place—which is responsible for calculating its actual size and position within its parent. Each geometry manager implements a completely different layout algorithm: pack stacks widgets against the edges of their container in the order they're packed, grid arranges widgets into a table of rows and columns, and place positions a widget at explicit coordinates or fractions of its parent's size. Tk enforces that a single container can only use one geometry manager for its direct children at a time—mixing pack and grid calls on widgets that share the same parent produces a well-known deadlock error—but nothing stops you from using pack inside one frame and grid inside a sibling frame nested within it.

🏏

Cricket analogy: Creating a widget without a geometry manager is like naming a player in the squad list without assigning them a batting position—pack, grid, or place is the team sheet that finally slots them into the XI.

pack: Stacking Along Sides

pack positions each widget against one side of its parent—-side top, bottom, left, or right—and widgets are placed in the order the pack command is called, each claiming space and shrinking the remaining area available to the next one. The -fill option (x, y, or both) lets a widget stretch to fill the space it's been allocated in a given direction, while -expand yes tells the widget to claim any extra leftover space in the parent when the window is resized. -padx and -pady add external spacing between the widget and its neighbors, and -ipadx/-ipady add internal padding inside the widget itself. Because pack is order-sensitive, swapping the order of two pack calls for widgets on the same side can visibly rearrange the layout even though every option stayed identical.

🏏

Cricket analogy: Pack's order-sensitivity is like a batting order—swapping who bats at number 3 versus number 4 changes the shape of the innings even if both players' individual technique is unchanged.

tcl
frame .toolbar
pack .toolbar -side top -fill x -pady 4

button .toolbar.new  -text "New"  -command newFile
button .toolbar.open -text "Open" -command openFile
button .toolbar.save -text "Save" -command saveFile

pack .toolbar.new .toolbar.open .toolbar.save -side left -padx 2 -ipadx 4

label .status -text "Ready" -anchor w -relief sunken
pack .status -side bottom -fill x

grid: Rows and Columns

grid arranges widgets into an invisible table using -row and -column, with -rowspan and -columnspan letting a widget stretch across multiple cells the way a merged cell does in a spreadsheet. The -sticky option controls how a widget behaves when its cell is larger than its natural size, using compass directions like nsew to stretch it in all four directions, w to left-align it, or ns to stretch it vertically only. Unlike pack, grid rows and columns don't automatically grow with the window; you must explicitly tell a row or column to absorb extra space with grid rowconfigure . 0 -weight 1 or grid columnconfigure . 1 -weight 2, where the weight value determines the proportion of extra space that row or column receives relative to others with nonzero weight.

🏏

Cricket analogy: -rowspan/-columnspan merging grid cells is like a scorecard entry for a six that spans both the "runs" and "boundary" columns in a single combined cell, rather than being split across two.

tcl
frame .form
pack .form -padx 10 -pady 10

label .form.nameLbl -text "Name:"
entry .form.nameEnt
label .form.emailLbl -text "Email:"
entry .form.emailEnt

grid .form.nameLbl  -row 0 -column 0 -sticky e -padx 4 -pady 2
grid .form.nameEnt  -row 0 -column 1 -sticky ew
grid .form.emailLbl -row 1 -column 0 -sticky e -padx 4 -pady 2
grid .form.emailEnt -row 1 -column 1 -sticky ew

grid columnconfigure .form 1 -weight 1

Never call pack and grid on widgets that share the same direct parent—Tk detects the conflict and raises "cannot use geometry manager grid inside .form which already has slaves managed by pack". If you need pack's stacking in one region and grid's tabular layout in another, put each region in its own child frame.

place: Absolute and Relative Positioning

place is the most primitive of the three managers: it positions a widget using absolute pixel coordinates (-x 20 -y 40) or coordinates relative to the parent's size (-relx 0.5 -rely 0.5 -anchor center), and optionally sizes it as a fraction of the parent with -relwidth/-relheight. Because place ignores the natural layout flow entirely, it's the right tool for a small set of specific cases—overlaying a splash-screen logo in the exact center of a window, drawing a status badge in a fixed corner of a canvas-like frame, or building a custom drag-and-drop surface—but it should not be used for ordinary form layout, since widgets placed with fixed coordinates don't reflow sensibly when the window is resized the way pack and grid do.

🏏

Cricket analogy: place -relx 0.5 -rely 0.5 -anchor center pinning a widget dead-center regardless of window size is like a broadcaster's fixed scorecard graphic that always sits centered on the screen bug no matter what device is streaming the match.

  • A widget must be handed to pack, grid, or place before it becomes visible; creation alone doesn't display it.
  • pack stacks widgets against container edges in call order using -side, -fill, and -expand.
  • grid arranges widgets into rows and columns using -row/-column, -rowspan/-columnspan, and -sticky.
  • grid rows/columns don't grow automatically; use grid rowconfigure/columnconfigure -weight to let them absorb extra space.
  • place positions widgets by absolute or relative coordinates and ignores natural layout flow.
  • A single container's direct children must all use the same geometry manager; mixing pack and grid on siblings raises an error.
  • Nest frames to combine managers: pack for the overall structure, grid inside a specific frame, for example.

Practice what you learned

Was this page helpful?

Topics covered

#Programming#TclTkStudyNotes#LayoutWithPackGridAndPlace#Layout#Pack#Grid#Place#StudyNotes#SkillVeris#ExamPrep