Summary: in this tutorial, you’ll learn to create a Tkinter combobox widget that allows users to select one value from a set of values.
Introduction to the Tkinter Combobox widget
A combobox is a combination of an Entry widget and a Listbox widget. A combobox widget allows you to select one value in a set of values. In addition, it allows you to enter a custom value.
Create a combobox
To create a combobox widget, you’ll use the ttk.Combobox()
constructor. The following example creates a combobox widget and links it to a string variable:
current_var = tk.StringVar()
combobox = ttk.Combobox(container, textvariable=current_var)
Code language: Python (python)
The container
is the window or frame on which you want to place the combobox widget.
The textvariable
argument links a variable current_var
to the current value of the combobox.
To get the currently selected value, you can use the current_var variable:
current_value = current_var.get()
Code language: Python (python)
Alternatively, you can use the get()
method of the combobox object:
current_value = combobox.get()
Code language: Python (python)
To set the current value, you use the current_var variable or the set()
method of the combobox object:
current_value.set(new_value)
combobox.set(new_value)
Code language: Python (python)
Define value list
The combobox has the values
property that you can assign a list of values to it like this:
combobox['values'] = ('value1', 'value2', 'value3')
Code language: Python (python)
By default, you can enter a custom value in the combobox. If you don’t want this, you can set the state
option to 'readonly'
:
combobox['state'] = 'readonly'
Code language: Python (python)
To re-enable editing the combobox, you use the 'normal'
state like this:
combobox['state'] = 'normal'
Code language: Python (python)
Bind events
When a select value changes, the combobox widget generates a '<<ComboboxSelected>>'
virtual event. To handle the event, you can use the bind() method like this:
combobox.bind('<<ComboboxSelected>>', callback)
Code language: Python (python)
In this example, the callback function will execute when the selected value of the combobox changes.
Set the current value
To set the current value, you use the set()
method:
combobox.set(self, value)
Code language: Python (python)
Also, you can use the current()
method:
current(self, newindex=None)
Code language: Python (python)
The newindex
specifies the index of values from the list that you want to select as the current value.
If you don’t specify the newindex
, the current()
method will return the index of the current value in the list of values or -1
if the current value doesn’t appear in the list.
Python Tkinter combobox example
The following program illustrates how to create a combobox widget:
import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfo
from calendar import month_name
root = tk.Tk()
# config the root window
root.geometry('300x200')
root.resizable(False, False)
root.title('Combobox Widget')
# label
label = ttk.Label(text="Please select a month:")
label.pack(fill=tk.X, padx=5, pady=5)
# create a combobox
selected_month = tk.StringVar()
month_cb = ttk.Combobox(root, textvariable=selected_month)
# get first 3 letters of every month name
month_cb['values'] = [month_name[m][0:3] for m in range(1, 13)]
# prevent typing a value
month_cb['state'] = 'readonly'
# place the widget
month_cb.pack(fill=tk.X, padx=5, pady=5)
# bind the selected value changes
def month_changed(event):
""" handle the month changed event """
showinfo(
title='Result',
message=f'You selected {selected_month.get()}!'
)
month_cb.bind('<<ComboboxSelected>>', month_changed)
root.mainloop()
Code language: Python (python)
Output:
The following program shows the same month combobox widget and uses the set() method to set the current value to the current month:
import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfo
from calendar import month_name
from datetime import datetime
root = tk.Tk()
# config the root window
root.geometry('300x200')
root.resizable(False, False)
root.title('Combobox Widget')
# label
label = ttk.Label(text="Please select a month:")
label.pack(fill=tk.X, padx=5, pady=5)
# create a combobox
selected_month = tk.StringVar()
month_cb = ttk.Combobox(root, textvariable=selected_month)
# get first 3 letters of every month name
month_cb['values'] = [month_name[m][0:3] for m in range(1, 13)]
# prevent typing a value
month_cb['state'] = 'readonly'
# place the widget
month_cb.pack(fill=tk.X, padx=5, pady=5)
# bind the selected value changes
def month_changed(event):
""" handle the month changed event """
showinfo(
title='Result',
message=f'You selected {selected_month.get()}!'
)
month_cb.bind('<<ComboboxSelected>>', month_changed)
# set the current month
current_month = datetime.now().strftime('%b')
month_cb.set(current_month)
root.mainloop()
Code language: Python (python)
Summary
- Use
ttk.Combobox(root, textvariable)
to create a combobox. - Set the
state
property toreadonly
to prevent users from entering custom values. - A combobox widget emits the
'<<ComboboxSelected>>'
event when the selected value changes.