Create and Customize Tkinter Checkbox (Checkbutton)
In this tutorial, you’ll learn how to create and customize checkboxes (Checkbutton) in Tkinter.
We begin by generating checkboxes automatically from a list of options and store selected ones.
Then, we’ll integrate checkboxes in a Listbox-like format. We’ll also learn how to right-align the text of your checkboxes.
Finally, we cover how to change the font size of checkbox labels and how to change the checkbox size.
- 1 Create Checkboxes from a List (Using Loop)
- 2 Store Multiple Selection Values
- 3 Delete Checkbox
- 4 Checkboxes in Listbox
- 5 Create Scrollable List of Checkbuttons
- 6 Grid of Checkboxes
- 7 Align Checkbox Text To Right Side
- 8 Change Checkbox Font Size
- 9 Change Checkbox Size
- 10 Change Checkbox Border Color
- 11 Checkboxes Inside Combobox
Create Checkboxes from a List (Using Loop)
You can loop through a Python list and create a checkbox (Checkbutton
) for each item.
You can also store the state of each checkbox in a separate variable.
import tkinter as tk root = tk.Tk() root.title("Service Selection") options = ["Plan A", "Plan B", "Feature X", "Feature Y", "Add-on Z"] checkboxes = {} for option in options: var = tk.BooleanVar() chk = tk.Checkbutton(root, text=option, variable=var) chk.pack(anchor=tk.W) checkboxes[option] = {'var': var, 'chk': chk} root.mainloop()
Output:
In this code, a list named options
contains various service options like “Plan A”, “Plan B”, etc.
For each option in the list, a checkbox is created.
The state of each checkbox is stored in a BooleanVar (var
), and the association between the option and its variable is maintained in the checkboxes
dictionary.
Store Multiple Selection Values
To store the values of the selected checkboxes, you need to iterate through the checkboxes
dictionary and check which checkboxes are selected.
This can be done by checking the state of each BooleanVar
associated with the checkboxes.
You can then append the corresponding option to a list if its checkbox is selected.
import tkinter as tk def get_selected_options(): selected_options = [] for option, data in checkboxes.items(): if data['var'].get(): selected_options.append(option) return selected_options root = tk.Tk() root.title("Service Selection") options = ["Plan A", "Plan B", "Feature X", "Feature Y", "Add-on Z"] checkboxes = {} for option in options: var = tk.BooleanVar() chk = tk.Checkbutton(root, text=option, variable=var) chk.pack(anchor=tk.W) checkboxes[option] = {'var': var, 'chk': chk} finalize_button = tk.Button(root, text="Finalize Selection", command=lambda: print(get_selected_options())) finalize_button.pack() root.mainloop()
When the button (finalize_button
) is clicked, it calls the get_selected_options
function and prints the stored selected options.
Delete Checkbox
Let’s say you want to delete the checkbox for “Feature X” from the above example.
You can do this by calling the destroy
method on the corresponding Checkbutton
widget and removing its entry from the checkboxes
dictionary.
def delete_checkbox(option): if option in checkboxes: checkboxes[option]['chk'].destroy() del checkboxes[option] delete_button = tk.Button(root, text="Delete 'Feature X'", command=lambda: delete_checkbox("Feature X")) delete_button.pack()
Checkboxes in Listbox
The Standard Listbox widget does not support embedding other widgets like checkboxes directly.
However, you can do a similar effect by using a Canvas
widget along with Frame
widgets for each item.
This allows you to place checkboxes in a scrollable list.
import tkinter as tk root = tk.Tk() root.title("Checkbox Listbox") canvas = tk.Canvas(root) scrollbar = tk.Scrollbar(root, orient="vertical", command=canvas.yview) scrollable_frame = tk.Frame(canvas) scrollable_frame.bind( "<Configure>", lambda e: canvas.configure( scrollregion=canvas.bbox("all") ) ) canvas.create_window((0, 0), window=scrollable_frame, anchor="nw") canvas.configure(yscrollcommand=scrollbar.set) options = ["Option " + str(i) for i in range(1, 21)] checkboxes = {} for option in options: var = tk.BooleanVar() chk = tk.Checkbutton(scrollable_frame, text=option, variable=var) chk.pack(anchor=tk.W) checkboxes[option] = var canvas.pack(side="left", fill="both", expand=True) scrollbar.pack(side="right", fill="y") root.mainloop()
Output:
Here, the Canvas
widget is used to provide a scrollable area.
The Frame
(canvas_frame
) is embedded inside the Canvas
. This frame acts as a container for the checkboxes.
Then, Checkboxes are added to the canvas_frame
, not directly to the Canvas
.
The scrollbar is configured to scroll the canvas view.
The scrollregion
of the canvas is updated based on the size of the canvas_frame
.
The above list is not scrollable by the mouse wheel.
You can use the ScrolledText
widget to display text and embed Checkbuttons into it.
import tkinter as tk from tkinter.scrolledtext import ScrolledText root = tk.Tk() text = ScrolledText(root, width=20, height=10) text.pack() for i in range(30): cb = tk.Checkbutton(text, text=f"Option {i}", bg='white', anchor='w') text.window_create('end', window=cb) text.insert('end', '\n') root.mainloop()
Output:
The loop iterates 30 times, each time it creates a Checkbutton
. These Checkbuttons are embedded into the ScrolledText
widget using the window_create
method.
The window_create
method attaches the Checkbutton to the text content, and 'end'
specifies that each new Checkbutton is added at the end of the current content.
Grid of Checkboxes
You can use a nested loop to create a grid of Tkinter checkboxes. The outer loop represents rows, and the inner loop represents columns.
For each position in the grid, create a checkbox and place it in the appropriate row and column.
import tkinter as tk root = tk.Tk() root.title("5x5 Checkbox Grid") for i in range(5): for j in range(5): checkbox = tk.Checkbutton(root, text=f"{i},{j}") checkbox.grid(row=i, column=j, sticky="w") root.mainloop()
Output:
The grid uses a sticky
parameter in the grid()
method to align the checkboxes to the west (left side) of the grid cells.
Align Checkbox Text To Right Side
You can align the text of a checkbox to the right side by configuring the Checkbutton
widget’s pack
property by setting the side
parameter to “right”.
import tkinter as tk root = tk.Tk() root.title("Right Aligned Checkbox Text") options = ["Option " + str(i) for i in range(1, 6)] checkbox_frame = tk.Frame(root) checkbox_frame.pack() checkboxes = {} for option in options: var = tk.BooleanVar() chk_frame = tk.Frame(checkbox_frame) chk_frame.pack(fill='x', expand=True) chk = tk.Checkbutton(chk_frame, variable=var) chk.pack(side='right', padx=5) lbl = tk.Label(chk_frame, text=option, anchor='e') lbl.pack(side='right', fill='x', expand=True) checkboxes[option] = var root.mainloop()
Output:
Change Checkbox Font Size
You can change the font size of a checkbox in Tkinter by configuring the font
property of the Checkbutton
widget.
The font
property accepts a tuple where you can specify the font family, size, and style (like bold, italic, etc.).
import tkinter as tk from tkinter import font root = tk.Tk() root.title("Checkbox with Custom Font Size") options = ["Option " + str(i) for i in range(1, 6)] checkbox_font = font.Font(family="Helvetica", size=14) checkboxes = {} for option in options: var = tk.BooleanVar() chk = tk.Checkbutton(root, text=option, variable=var, font=checkbox_font) chk.pack(anchor=tk.W) checkboxes[option] = var root.mainloop()
Output:
The Font
class is used to define the font properties. In this case, we set the family
to “Helvetica” and size
to 14. You can adjust these values as needed.
The custom font (checkbox_font
) is applied to each Checkbutton
via the font
parameter.
Change Checkbox Size
Changing the font size doesn’t change te the actual checkbox square (the box part of the Checkbutton
widget)
To change the checkbox size, you can create a custom checkbox using images for the checked and unchecked states.
This way, you can control the exact size and appearance of the checkbox.
import tkinter as tk def toggle(): global checked checked = not checked image = checked_image if checked else unchecked_image chk_button.config(image=image) root = tk.Tk() root.title("Custom Checkbox Size") checked = False checked_image = tk.PhotoImage(file='checked.png') unchecked_image = tk.PhotoImage(file='unchecked.png') chk_button = tk.Button(root, image=unchecked_image, command=toggle, bd=0) chk_button.pack() root.mainloop()
Output:
The toggle
function changes the image displayed by the button.
Change Checkbox Border Color
To change the checkbox border color, you can create a custom checkbox using a Frame
as a border, and place a Checkbutton
inside it.
Then you can change the background color of the Frame
to mimic a border color.
import tkinter as tk root = tk.Tk() root.title("Custom Checkbutton Border") border_color_frame = tk.Frame(root, background="red", bd=1) border_color_frame.pack(pady=10) chk_var = tk.BooleanVar() chk_button = tk.Checkbutton(border_color_frame, text="Check Me", variable=chk_var) chk_button.pack(padx=1, pady=1) root.mainloop()
Output:
In this code, a Frame
with a red background (background="red"
) acts as the border around the Checkbutton
.
Adjusting the bd
(borderwidth) of the Frame
and padx
, pady
of the Checkbutton
will change the apparent thickness of this ‘border’.
Checkboxes Inside Combobox
You can create a custom dropdown menu using a Toplevel
window containing Checkbuttons.
This custom dropdown can mimic the behavior of a Combobox with Checkbuttons.
import tkinter as tk from tkinter import ttk class CheckbuttonCombobox: def __init__(self, master, options): self.master = master self.options = options self.selected_values = [] self.create_dropdown() def create_dropdown(self): self.btn = ttk.Button(self.master, text="Select Options", command=self.show_dropdown) self.btn.pack() self.top_level = tk.Toplevel(self.master) self.top_level.withdraw() for option in self.options: mvar = tk.BooleanVar() chk = tk.Checkbutton(self.top_level, text=option, variable=mvar, command=lambda opt=option, var=mvar: self.on_select(opt, var)) chk.pack(anchor='w') self.selected_values.append((option, mvar)) self.top_level.overrideredirect(True) self.top_level.geometry(f"+{self.btn.winfo_rootx()}+{self.btn.winfo_rooty() + self.btn.winfo_height()}") def show_dropdown(self): if self.top_level.state() == 'normal': self.top_level.withdraw() else: x = self.btn.winfo_rootx() y = self.btn.winfo_rooty() + self.btn.winfo_height() self.top_level.geometry(f"+{x}+{y}") self.top_level.deiconify() def on_select(self, option, var): print(f"{option} is {'selected' if var.get() else 'deselected'}") root = tk.Tk() root.title("Combobox with Checkbuttons") options = ["Option 1", "Option 2", "Option 3"] dropdown = CheckbuttonCombobox(root, options) root.mainloop()
Output:
This code provides a dropdown-like widget containing Checkbuttons, similar to a multi-select Combobox.
It’s a custom solution if you need to select multiple options from a dropdown menu.
Mokhtar is the founder of LikeGeeks.com. He is a seasoned technologist and accomplished author, with expertise in Linux system administration and Python development. Since 2010, Mokhtar has built an impressive career, transitioning from system administration to Python development in 2015. His work spans large corporations to freelance clients around the globe. Alongside his technical work, Mokhtar has authored some insightful books in his field. Known for his innovative solutions, meticulous attention to detail, and high-quality work, Mokhtar continually seeks new challenges within the dynamic field of technology.