How to Position Widgets in Tkinter

How To Position Widgets in Tkinter QR Cover
Before we start: This Python tutorial is a part of our series of Python Package tutorials. You can find other Tkinter related topics too!

Tkinter is the most popular way to create Graphical User Interfaces (GUIs) in Python. For building GUIs, Tkinter provides developers with a number of standard widgets, including buttons, labels and text boxes.

Each of these widgets need to be positioned for user accessibility and widget focus, and then programmed with underlying application logic so they can work as intended in response to mouse clicks and other actions.

Positioning Widgets with Layout Managers

Tkinter has three built-in layout managers that use geometric methods to position widgets in an application frame: 

  • pack() organizes widgets in horizontal and vertical boxes that are limited to left, right, top, bottom positions. Each box is offset and relative to each other.
  • place() places widgets in a two dimensional grid using x and y absolute coordinates. 
  • grid() locates widgets in a two dimensional grid using row and column absolute coordinates. 

Important: pack(), place(), and grid() should not be combined in the same master window. Instead choose one and stick with it.

Watch the video, which introduces the pack, place and grid code snippets below

Positioning Widgets With the Pack Layout Manager

pack is the easiest layout manager to use with Tkinter. Instead of declaring the precise location of a widget, pack() declares the positioning of widgets in relation to each other. However, pack() is limited in precision compared to place() and grid() which feature absolute positioning. For simple positioning of widgets vertically or horizontally in relation to each other, pack() is the layout manager of choice.

pack() has four padding options: 

  • Internal padding 
  • External padding 
  • Padx, which pads along the x axis
  • Pady, which pads along the y axis

For more information about pack() and its options, refer to: How To Position Buttons in Tkinter With Pack

Vertical Positioning with Pack 

In this example,  three labels (widgets that contain text or images) are positioned vertically in relation to each other, and are not padded.

import tkinter as tk
root = tk.Tk()
test = tk.Label(root, text="Red", bg="red", fg="white")
test.pack(side=tk.BOTTOM)
test = tk.Label(root, text="Green", bg="green", fg="white")
test.pack(side=tk.BOTTOM)
test = tk.Label(root, text="Purple", bg="purple", fg="white")
test.pack(side=tk.BOTTOM)
tk.mainloop()

Side-by-Side Positioning with Pack

In this example, three labels are positioned side by side in relation to each other, and are padded to separate them:

import tkinter as tk
root = tk.Tk()
test = tk.Label(root, text="red", bg="red", fg="white")
test.pack(padx=5, pady=15, side=tk.LEFT)
test = tk.Label(root, text="green", bg="green", fg="white")
test.pack(padx=5, pady=20, side=tk.LEFT)
test = tk.Label(root, text="purple", bg="purple", fg="white")
test.pack(padx=5, pady=20, side=tk.LEFT)
root.mainloop()

Positioning Widgets With Place Layout Manager 

place() lets you position a widget either with absolute x,y  coordinates, or relative to another widget. 

Example 

In this example, three labels are positioned diagonally using x,y coordinates.

from tkinter import *
root = Tk()
root.geometry('250x200+250+200')
Label(root, text="Position 1 : x=0, y=0", bg="#FFFF00", fg="white").place(x=5, y=0)
Label(root, text="Position 2 : x=50, y=40", bg="#3300CC", fg="white").place(x=50, y=40)
Label(root, text="Position 3 : x=75, y=80", bg="#FF0099", fg="white").place(x=75, y=80)
root.mainloop()

Positioning Widgets With Grid Layout Manager 

grid() positions widgets in a two dimensional grid of rows and columns similar to a spreadsheet.

Example

In this example, four labels are positioned in a grid of rows and columns:

from tkinter import *
root = Tk()
Label(text="Position 1", width=10).grid(row=0, column=0)
Label(text="Position 2", width=10).grid(row=0, column=1)
Label(text="Position 3", width=10).grid(row=1, column=0)
Label(text="Position 4", width=10).grid(row=1, column=1)
root.mainloop()

Positioning Tkinter.Ttk Widgets

The tkinter.ttk (Tile extension integrated into Tk) module provides access to the Tk themed widget set included in Tk 8.5 and greater. 

Six new widgets are added by Ttk:

  • Combobox
  • Notebook
  • Progressbar
  • Separator
  • Sizegrip
  • Treeview

All six are subclasses of Widget.

There are differences in how the Ttk theme is coded, including alignment and padding options for the six new widgets. However, positioning with the pack, place and grid layout managers remains the same as Tk.

Ttk Usage 

To start using Ttk, enter the following import statement in a Python console:

from tkinter import ttk

To override Tk widgets, the ttk import must follow the tk import:

from tkinter import *
from tkinter.ttk import *

Importing tkinter.ttk after importing tkinter causes Ttk widgets to automatically replace the standard Tk widgets of Button, Checkbutton, Entry, Frame, Label, LabelFrame, Menubutton, PanedWindow, Radiobutton, Scale and Scrollbar. 

Important: The basic idea is to separate as much as possible the code implementing a widget’s behavior from the code implementing its appearance (Style()).

Keep in mind that while Ttk widgets have a Style()padding option, it does not affect widget positioning. 

Positioning Ttk widgets with Pack

In this example, a ttk.button is positioned with pack() and is padded.

from tkinter import *
from tkinter.ttk import *
root = Tk()
# Style() padding adds pixels inside the Button. The widget’s position is not changed.
ttk.Style().configure("TButton", padding=5, relief="flat")
button1 = ttk.Button(text="Button Example")
# pack() padding adds pixels outside the TButton. The widget’s position is changed.
button1.pack(side = BOTTOM, padx=<x_coordinate, pady=<y_coordinate>)
root.mainloop()

Next steps

Now that you know how to add widgets using Python’s Tkinter, let’s move on to other things you can do with Tkinter:

Python For Data Science

Pre-bundled with the most important packages Data Scientists need, ActivePython is pre-compiled so you and your team don’t have to waste time configuring the open source distribution. You can focus on what’s important–spending more time building algorithms and predictive models against your big data sources, and less time on system configuration.

Some Popular Python Packages for Data Science/Big Data/Machine LearningYou Get Pre-compiled – with ActivePython

  • pandas (data analysis)
  • NumPy (multi-dimensional arrays)
  • SciPy (algorithms to use with numpy)
  • HDF5 (store & manipulate data)
  • Matplotlib (data visualization)
  • Jupyter (research collaboration)
  • PyTables (managing HDF5 datasets)
  • HDFS (C/C++ wrapper for Hadoop)
  • pymongo (MongoDB driver)
  • SQLAlchemy (Python SQL Toolkit)
Related Links

Recent Posts

Tech Debt Best Practices: Minimizing Opportunity Cost & Security Risk

Tech debt is an unavoidable consequence of modern application development, leading to security and performance concerns as older open-source codebases become more vulnerable and outdated. Unfortunately, the opportunity cost of an upgrade often means organizations are left to manage growing risk the best they can. But it doesn’t have to be this way.

Read More
Scroll to Top