Tkinter is Python’s built-in library for creating graphical user interfaces (GUIs). It acts as a lightweight wrapper around Tcl/Tk GUI toolkit, offering Python developers a simple and intuitive way to build desktop applications. It supports layout management, event handling and customization, making it ideal for rapid GUI development in Python.
Why do we need Tkinter?
- Provides a built-in and easy-to-use way to create GUI (Graphical User Interface) applications in Python.
- Offers various widgets like buttons, labels, text boxes and menus to build interactive apps.
- Eliminates the need for external GUI frameworks tkinter comes bundled with Python.
- Useful for building desktop applications like calculators, form apps and dashboards.
- Supports event-driven programming, making it suitable for responsive user interfaces.
Create First Tkinter GUI Application
To create a Tkinter Python app, follow these basic steps:
- Import the tkinter module: Import the tkinter module, which is necessary for creating the GUI components.
- Create the main window (container): Initialize the main application window using the Tk() class.
- Set Window Properties: We can set properties like the title and size of the window.
- Add widgets to the main window: We can add any number of widgets like buttons, labels, entry fields, etc., to the main window to design the interface.
- Pack Widgets: Use geometry managers like pack(), grid() or place() to arrange the widgets within the window.
- Apply event triggers to the widgets: We can attach event triggers to the widgets to define how they respond to user interactions.
There are two main methods used which user needs to remember while creating the Python application with GUI. These methods are:
1. Tk()
To create a main window in Tkinter, we use the Tk() class.
Syntax:
root = tk.Tk(screenName=None, baseName=None, className='Tk', useTk=1)
Parameter:
- screenName: This parameter is used to specify the display name.
- baseName: This parameter can be used to set the base name of the application.
- className: We can change the name of the window by setting this parameter to the desired name.
- useTk: This parameter indicates whether to use Tk or not.
2. mainloop()
The mainloop() method is used to run application once it is ready. It is an infinite loop that keeps application running, waits for events to occur (such as button clicks) and processes these events as long as window is not closed.
Example:
This code initializes a basic GUI window using Tkinter. The tkinter.Tk() function creates main application window, mainloop() method starts event loop, which keeps the window running and responsive to user interactions.
Python
import tkinter
m = tkinter.Tk()
'''
widgets are added here
'''
m.mainloop()
Output

There are a number of tkinter widgets which we can put in our tkinter application. Some of the major widgets are explained below:
1. Label
It refers to the display box where we display text or image. It can have various options like font, background, foreground, etc.
Syntax:
w=Label(master, option=value)
Parameter: master used to represent parent window.
Example:
This code creates a simple GUI window using Tkinter that displays a text label. It imports all Tkinter classes, initializes main window (root), adds a Label widget with text "GeeksForGeeks.org!", packs label into window.
Python
from tkinter import *
root = Tk()
w = Label(root, text='GeeksForGeeks.org!')
w.pack()
root.mainloop()
Output:

Note: We have a number of options and parameters that we can pass to widgets, only some them are used in the examples given in this article.
A clickable button that can trigger an action.
Syntax:
w=Button(master, option=value)
Example:
This code creates a window titled "Counting Seconds" with a single "Stop" button. When button is clicked, window closes. It demonstrates how to set a window title, create a button widget and assign a command to terminate the application.
Python
import tkinter as tk
r = tk.Tk()
r.title('Counting Seconds')
button = tk.Button(r, text='Stop', width=25, command=r.destroy)
button.pack()
r.mainloop()
Output:

3. Entry
It is used to input the single line text entry from the user. For multi-line text input, Text widget is used.
Syntax:
w=Entry(master, option=value)
Example:
This code creates a form with two labeled input fields: First Name and Last Name. It uses Label widgets to display field names and Entry widgets to accept user input. The grid() geometry manager arranges the labels and entry fields in a tabular layout.
Python
from tkinter import *
master = Tk()
Label(master, text='First Name').grid(row=0)
Label(master, text='Last Name').grid(row=1)
e1 = Entry(master)
e2 = Entry(master)
e1.grid(row=0, column=1)
e2.grid(row=1, column=1)
mainloop()
Output:

A checkbox can be toggled on or off. It can be linked to a variable to store its state.
Syntax:
w = CheckButton(master, option=value)
Example:
This code creates a window with two checkboxes labeled "male" and "female". It uses Checkbutton widgets linked to IntVar() variables to store checked state (1 for checked, 0 for unchecked). The grid() method arranges checkboxes vertically with left alignment using sticky=W.
Python
from tkinter import *
master = Tk()
var1 = IntVar()
Checkbutton(master, text='male', variable=var1).grid(row=0, sticky=W)
var2 = IntVar()
Checkbutton(master, text='female', variable=var2).grid(row=1, sticky=W)
mainloop()
Output:

It allows user to select one option from a set of choices. They are grouped by sharing the same variable.
Syntax:
w = RadioButton(master, option=value)
Example:
This code creates a window with two radio buttons labeled "GfG" and "MIT". Radio buttons are linked to same IntVar() variable v ensuring only one can be selected at a time. The selected option sets v to its respective value (1 or 2) and buttons are vertically aligned to left using pack(anchor=W).
Python
from tkinter import *
root = Tk()
v = IntVar()
Radiobutton(root, text='GfG', variable=v, value=1).pack(anchor=W)
Radiobutton(root, text='MIT', variable=v, value=2).pack(anchor=W)
mainloop()
Output

6. Listbox
It displays a list of items from which a user can select one or more.
Syntax:
w = Listbox(master, option=value)
Example:
This code creates a window with a Listbox widget that displays a list of programming languages. The insert() method adds each item to Listbox at specified index and pack() displays Listbox in the window. The GUI runs using mainloop().
Python
from tkinter import *
top = Tk()
Lb = Listbox(top)
Lb.insert(1, 'Python')
Lb.insert(2, 'Java')
Lb.insert(3, 'C++')
Lb.insert(4, 'Any other')
Lb.pack()
top.mainloop()
Output

It refers to the slide controller which will be used to implement listed widgets.
Syntax:
w = Scrollbar(master, option=value)
Example:
This code creates a Listbox containing 100 lines of text and a vertical Scrollbar. The Scrollbar is linked to Listbox using yscrollcommand and command, allowing user to scroll through long list of items. The list is packed on left and fills the window, while the scrollbar is packed on right.
Python
from tkinter import *
root = Tk()
scrollbar = Scrollbar(root)
scrollbar.pack(side=RIGHT, fill=Y)
mylist = Listbox(root, yscrollcommand=scrollbar.set)
for line in range(100):
mylist.insert(END, 'This is line number' + str(line))
mylist.pack(side=LEFT, fill=BOTH)
scrollbar.config(command=mylist.yview)
mainloop()
Output

It is used to create all kinds of menus used by the application.
Syntax:
window.w = Menu(master, option=value)
Example:
This code creates a menu bar containing "File" and "Help" menus. The Menu widget is used to build dropdown menus. Under "File", options like New, Open, a separator and Exit (which closes the app) are added. The "Help" menu contains an About option. The root.config(menu=menu) line links the menu bar to main window.
Python
from tkinter import *
root = Tk()
menu = Menu(root)
root.config(menu=menu)
filemenu = Menu(menu)
menu.add_cascade(label='File', menu=filemenu)
filemenu.add_command(label='New')
filemenu.add_command(label='Open...')
filemenu.add_separator()
filemenu.add_command(label='Exit', command=root.quit)
helpmenu = Menu(menu)
menu.add_cascade(label='Help', menu=helpmenu)
helpmenu.add_command(label='About')
mainloop()
Output:

9. Combobox
The Combobox widget from tkinter.ttk is created using Combobox class. Its options are set via values parameter, and a default value is assigned using set() method. An event handler (like on_select) can be bound using bind() to update other widgets based on selected item.
Syntax:
combo = Combobox(master, values=[...], state='readonly')
Example:
This program creates a dropdown menu using ttk.Combobox. It sets a default option and updates a label to show the selected item when a user makes a choice.
Python
import tkinter as tk
from tkinter import ttk
def select(event):
selected_item = combo_box.get()
label.config(text="Selected Item: " + selected_item)
root = tk.Tk()
root.title("Combobox Example")
# Create a label
label = tk.Label(root, text="Selected Item: ")
label.pack(pady=10)
# Create a Combobox widget
combo_box = ttk.Combobox(root, values=["Option 1", "Option 2", "Option 3"])
combo_box.pack(pady=5)
# Set default value
combo_box.set("Option 1")
# Bind event to selection
combo_box.bind("<<ComboboxSelected>>", select)
root.mainloop()
Output:

10. Scale
It is used to provide a graphical slider that allows to select any value from that scale.
Syntax:
w = Scale(master, option=value)
Example:
This demonstrates how to create vertical and horizontal sliders using Scale widget. The first scale ranges from 0 to 42 (vertical by default) and second ranges from 0 to 200 with horizontal orientation.
Python
from tkinter import *
master = Tk()
w = Scale(master, from_=0, to=42)
w.pack()
w = Scale(master, from_=0, to=200, orient=HORIZONTAL)
w.pack()
mainloop()
Output:

11. TopLevel
This widget is directly controlled by the window manager. It don't need any parent window to work on.
Syntax:
w = TopLevel(master, option=value)
Example:
This code demonstrates use of Toplevel to create a new, separate window in addition to main application window. The main window is titled 'GfG' and secondary window titled 'Python' opens using Toplevel(), allowing for multi-window interfaces.
Python
from tkinter import *
root = Tk()
root.title('GfG')
top = Toplevel()
top.title('Python')
top.mainloop()
Output

12. Message
It is a widget to display text messages with word wrapping.
Syntax:
w = Message(master, option=value)
Example:
This code demonstrates Message widget to display multi-line text. It creates a main window and shows a message with a light green background using Message widget, which automatically formats text to fit within window.
Python
from tkinter import *
main = Tk()
ourMessage = 'This is our Message'
messageVar = Message(main, text=ourMessage)
messageVar.config(bg='lightgreen')
messageVar.pack()
main.mainloop()
Output

It is a part of top-down menu which stays on the window all the time. Every menubutton has its own functionality.
Syntax:
w = MenuButton(master, option=value)
Example:
This code use Menubutton widget in Tkinter. It creates a button labeled "GfG" that displays a dropdown menu when clicked. The dropdown contains checkbutton options like "Contact" and "About", each linked to an IntVar to store their state (checked or unchecked).
Python
from tkinter import *
top = Tk()
mb = Menubutton ( top, text = "GfG")
mb.grid()
mb.menu = Menu ( mb, tearoff = 0 )
mb["menu"] = mb.menu
cVar = IntVar()
aVar = IntVar()
mb.menu.add_checkbutton ( label ='Contact', variable = cVar )
mb.menu.add_checkbutton ( label = 'About', variable = aVar )
mb.pack()
top.mainloop()
Output:

14. Progressbar
progressbar indicates the progress of a long-running task. When the button is clicked, the progressbar fills up to 100% over a short period, simulating a task that takes time to complete.
Syntax:
Progressbar(parent, orient, length, mode)
Example:
This code create and control a Progressbar using Tkinter. It builds a GUI with a button that, when clicked, simulates a long-running task by gradually filling progress bar from 0 to 100%. The Progressbar is created using ttk.Progressbar and its value is updated inside a loop using time.sleep() to mimic delay, with update_idletasks() keeping UI responsive during operation.
Python
import tkinter as tk
from tkinter import ttk
import time
def start_progress():
progress.start()
# Simulate a task that takes time to complete
for i in range(101):
# Simulate some work
time.sleep(0.05)
progress['value'] = i
# Update the GUI
root.update_idletasks()
progress.stop()
root = tk.Tk()
root.title("Progressbar Example")
# Create a progressbar widget
progress = ttk.Progressbar(root, orient="horizontal", length=300, mode="determinate")
progress.pack(pady=20)
# Button to start progress
start_button = tk.Button(root, text="Start Progress", command=start_progress)
start_button.pack(pady=10)
root.mainloop()
Output:

15. SpinBox
It is an entry of 'Entry' widget. Here, value can be input by selecting a fixed value of numbers.
Syntax:
w = SpinBox(master, option=value)
Example:
This code creates a simple Spinbox widget. The Spinbox allows users to select a numeric value from 0 to 10 using up/down arrows. The widget is packed into the main window using pack().
Python
from tkinter import *
master = Tk()
w = Spinbox(master, from_=0, to=10)
w.pack()
mainloop()
Output:

16. Text
To edit a multi-line text and format the way it has to be displayed.
Syntax:
w =Text(master, option=value)
Example:
In this code text widget is used for multi-line text input or display. It is set to a height of 2 lines and a width of 30 characters. Some default text ('GeeksforGeeks\nBEST WEBSITE\n') is inserted using insert()
Python
from tkinter import *
root = Tk()
T = Text(root, height=2, width=30)
T.pack()
T.insert(END, 'GeeksforGeeks\nBEST WEBSITE\n')
mainloop()
Output:

17. Canvas
It is used to draw pictures and other complex layout like graphics, text and widgets.
Syntax:
w = Canvas(master, option=value)
Example:
This code creates a Canvas widget to draw a horizontal line. A canvas of width 40 and height 60 is created and a horizontal line is drawn across middle using create_line(). The canvas allows for drawing shapes like lines, rectangles and more.
Python
from tkinter import *
master = Tk()
w = Canvas(master, width=40, height=60)
w.pack()
canvas_height=20
canvas_width=200
y = int(canvas_height / 2)
w.create_line(0, y, canvas_width, y )
mainloop()
Output:

18. PannedWindow
It is a container widget which is used to handle number of panes arranged in it.
Syntax:
w = PannedWindow(master, option=value)
Example:
This code use PanedWindow widget which allows organizing child widgets in resizable panes. It creates a horizontal m1 and adds an Entry widget to its left. Then, a vertical m2 is nested inside m1, containing a Scale widget. Users can adjust the panes' size by dragging handles.
Python
from tkinter import *
m1 = PanedWindow()
m1.pack(fill=BOTH, expand=1)
left = Entry(m1, bd=5)
m1.add(left)
m2 = PanedWindow(m1, orient=VERTICAL)
m1.add(m2)
top = Scale(m2, orient=HORIZONTAL)
m2.add(top)
mainloop()
Output

Color Option in Tkinter
This example demonstrates the usage of various color options in Tkinter widgets, including active background and foreground colors, background and foreground colors, disabled state colors and selection colors. Each widget in the example showcases a different color option, providing a visual representation of how these options affect the appearance of the widgets.
Python
import tkinter as tk
root = tk.Tk()
root.title("Color Options in Tkinter")
# Create a button with active background and foreground colors
button = tk.Button(root, text="Click Me", activebackground="blue", activeforeground="white")
button.pack()
# Create a label with background and foreground colors
label = tk.Label(root, text="Hello, Tkinter!", bg="lightgray", fg="black")
label.pack()
# Create an Entry widget with selection colors
entry = tk.Entry(root, selectbackground="lightblue", selectforeground="black")
entry.pack()
root.mainloop()
Output

Learn more to Improve Font: Tkinter Font
Tkinter Geometry Managers
Tkinter also offers access to the geometric configuration of the widgets which can organize the widgets in the parent windows. There are mainly three geometry manager classes class.
pack() method
It organizes the widgets in blocks before placing in the parent widget. Widgets can be packed from the top, bottom, left or right. It can expand widgets to fill the available space or place them in a fixed size.
Example:
Python
import tkinter as tk
root = tk.Tk()
root.title("Pack Example")
# Create three buttons
button1 = tk.Button(root, text="Button 1")
button2 = tk.Button(root, text="Button 2")
button3 = tk.Button(root, text="Button 3")
# Pack the buttons vertically
button1.pack()
button2.pack()
button3.pack()
root.mainloop()
Output

grid() method
It organizes the widgets in grid (table-like structure) before placing in the parent widget. Each widget is assigned a row and column. Widgets can span multiple rows or columns using rowspan and columnspan.
Example:
Python
import tkinter as tk
root = tk.Tk()
root.title("Grid Example")
# Create three labels
label1 = tk.Label(root, text="Label 1")
label2 = tk.Label(root, text="Label 2")
label3 = tk.Label(root, text="Label 3")
# Grid the labels in a 2x2 grid
label1.grid(row=0, column=0)
label2.grid(row=0, column=1)
label3.grid(row=1, column=0, columnspan=2)
root.mainloop()
Output

place() method
It organizes the widgets by placing them on specific positions directed by the programmer. Widgets are placed at specific x and y coordinates. Sizes and positions can be specified in absolute or relative terms.
Python
import tkinter as tk
root = tk.Tk()
root.title("Place Example")
# Create a label
label = tk.Label(root, text="Label")
# Place the label at specific coordinates
label.place(x=50, y=50)
root.mainloop()
Output

Event Handling in Tkinter
In Tkinter, events are actions that occur when a user interacts with the GUI, such as pressing a key, clicking a mouse button or resizing a window. Event handling allows us to define how our application should respond to these interactions.
Events and Bindings
Events in Tkinter are captured and managed using a mechanism called bindings. A binding links an event to a callback function (also known as an event handler) that is called when the event occurs.
Syntax:
widget.bind(event, handler)
- widget: The Tkinter widget you want to bind the event to.
- event: A string that specifies the type of event (e.g., <Button-1> for a left mouse click).
- handler: The callback function that will be executed when the event occurs.
Key and Mouse Events
Key events are triggered when a user presses a key on the keyboard. Mouse events are triggered by mouse actions, such as clicking or moving the mouse.
Example:
Python
import tkinter as tk
def on_key_press(event):
print(f"Key pressed: {event.keysym}")
def on_left_click(event):
print(f"Left click at ({event.x}, {event.y})")
def on_right_click(event):
print(f"Right click at ({event.x}, {event.y})")
def on_mouse_motion(event):
print(f"Mouse moved to ({event.x}, {event.y})")
root = tk.Tk()
root.title("Advanced Event Handling Example")
root.bind("<KeyPress>", on_key_press)
root.bind("<Button-1>", on_left_click)
root.bind("<Button-3>", on_right_click)
root.bind("<Motion>", on_mouse_motion)
root.mainloop()
Output:
Mouse moved to (182, 41)
Mouse moved to (141, 20)
Mouse moved to (134, 17)
Mouse moved to (128, 15)
Mouse moved to (125, 13)
Mouse moved to (122, 12)
Mouse moved to (120, 12)
Mouse moved to (119, 12)
Mouse moved to (117, 14)
Mouse moved to (117, 18)
In this advanced example, multiple event types are handled simultaneously. The on_mouse_motion function is called whenever the mouse is moved within the window, demonstrating how we can track and respond to continuous events.
Event Object
The event object is passed to the callback function when an event occurs. It contains useful information about the event, such as:
- event.keysym: The key symbol (e.g., 'a', 'Enter').
- event.x and event.y: The x and y coordinates of the mouse event.
- event.widget: The widget that triggered the event.