Skip to main content

Overview

CTkOptionMenu is a dropdown menu widget that displays a selected value and opens a menu of options when clicked. It’s similar to a combobox but does not allow text input.

Constructor

CTkOptionMenu(
    master,
    width=140,
    height=28,
    corner_radius=None,
    bg_color="transparent",
    fg_color=None,
    button_color=None,
    button_hover_color=None,
    text_color=None,
    text_color_disabled=None,
    dropdown_fg_color=None,
    dropdown_hover_color=None,
    dropdown_text_color=None,
    font=None,
    dropdown_font=None,
    values=None,
    variable=None,
    state=tkinter.NORMAL,
    hover=True,
    command=None,
    dynamic_resizing=True,
    anchor="w",
    **kwargs
)

Parameters

master
Any
required
Parent widget
width
int
default:"140"
Width of the option menu in pixels
height
int
default:"28"
Height of the option menu in pixels
corner_radius
Optional[int]
default:"None"
Corner radius in pixels. If None, uses theme default
bg_color
Union[str, Tuple[str, str]]
default:"'transparent'"
Background color behind the widget
fg_color
Optional[Union[str, Tuple[str, str]]]
default:"None"
Foreground color of the main button area. If None, uses theme default
button_color
Optional[Union[str, Tuple[str, str]]]
default:"None"
Color of the dropdown arrow button area. If None, uses theme default
button_hover_color
Optional[Union[str, Tuple[str, str]]]
default:"None"
Button color when hovering. If None, uses theme default
text_color
Optional[Union[str, Tuple[str, str]]]
default:"None"
Color of the displayed text. If None, uses theme default
text_color_disabled
Optional[Union[str, Tuple[str, str]]]
default:"None"
Text color when disabled. If None, uses theme default
dropdown_fg_color
Optional[Union[str, Tuple[str, str]]]
default:"None"
Background color of the dropdown menu. If None, uses theme default
dropdown_hover_color
Optional[Union[str, Tuple[str, str]]]
default:"None"
Hover color for dropdown menu items. If None, uses theme default
dropdown_text_color
Optional[Union[str, Tuple[str, str]]]
default:"None"
Text color for dropdown menu items. If None, uses theme default
font
Optional[Union[tuple, CTkFont]]
default:"None"
Font for the displayed text
dropdown_font
Optional[Union[tuple, CTkFont]]
default:"None"
Font for the dropdown menu items
values
Optional[list]
default:"None"
List of string values to display in the dropdown. If None, defaults to [“CTkOptionMenu”]
variable
Union[tkinter.Variable, None]
default:"None"
Tkinter variable (StringVar) to link with the selected value
state
str
default:"tkinter.NORMAL"
State of the widget: tkinter.NORMAL or tkinter.DISABLED
hover
bool
default:"True"
Enable/disable hover effect
command
Union[Callable[[str], Any], None]
default:"None"
Callback function called when an option is selected. Receives the selected value as argument
dynamic_resizing
bool
default:"True"
If True, widget resizes to fit content. If False, uses fixed width
anchor
str
default:"'w'"
Text anchor position: “w” (left), “center”, or “e” (right)

Methods

get()

Returns the currently selected value.
selected = optionmenu.get()
Returns: str - The currently selected value

set()

Sets the displayed value.
optionmenu.set("Option 2")
Parameters:
  • value (str): Value to display and set

configure()

Configures widget parameters.
optionmenu.configure(values=["New1", "New2"], fg_color="blue")

cget()

Returns the value of a configuration parameter.
values = optionmenu.cget("values")

Usage Examples

Basic OptionMenu

import customtkinter as ctk

root = ctk.CTk()

optionmenu = ctk.CTkOptionMenu(
    root,
    values=["Option 1", "Option 2", "Option 3"]
)
optionmenu.pack(pady=20, padx=20)

root.mainloop()

OptionMenu with Command

def on_option_selected(choice):
    print(f"Selected: {choice}")
    label.configure(text=f"You selected: {choice}")

optionmenu = ctk.CTkOptionMenu(
    root,
    values=["Python", "JavaScript", "Java", "C++"],
    command=on_option_selected
)
optionmenu.pack(pady=20)
optionmenu.set("Python")  # Set initial value

label = ctk.CTkLabel(root, text="You selected: Python")
label.pack()

Using with Variable

import tkinter as tk

language_var = tk.StringVar(value="Python")

optionmenu = ctk.CTkOptionMenu(
    root,
    values=["Python", "JavaScript", "Java", "C++"],
    variable=language_var
)
optionmenu.pack(pady=20)

# Access value through variable
def get_selection():
    print(f"Selected language: {language_var.get()}")

btn = ctk.CTkButton(root, text="Get Selection", command=get_selection)
btn.pack()

Getting and Setting Values

optionmenu = ctk.CTkOptionMenu(
    root,
    values=["Small", "Medium", "Large"]
)
optionmenu.pack(pady=20)

# Set to specific value
optionmenu.set("Large")

# Get current value
def show_current():
    current = optionmenu.get()
    print(f"Current selection: {current}")

show_btn = ctk.CTkButton(root, text="Show Current", command=show_current)
show_btn.pack()

Dynamically Updating Values

optionmenu = ctk.CTkOptionMenu(
    root,
    values=["Item 1", "Item 2"]
)
optionmenu.pack(pady=20)

def add_option():
    current_values = optionmenu.cget("values")
    new_values = current_values + [f"Item {len(current_values) + 1}"]
    optionmenu.configure(values=new_values)

add_btn = ctk.CTkButton(root, text="Add Option", command=add_option)
add_btn.pack()

Custom Styled OptionMenu

optionmenu = ctk.CTkOptionMenu(
    root,
    values=["Option 1", "Option 2", "Option 3"],
    width=200,
    height=35,
    corner_radius=10,
    fg_color="#2c3e50",
    button_color="#3498db",
    button_hover_color="#2980b9",
    text_color="white",
    dropdown_fg_color="#34495e",
    dropdown_hover_color="#3498db",
    dropdown_text_color="white",
    font=("Helvetica", 14),
    dropdown_font=("Helvetica", 12)
)
optionmenu.pack(pady=20, padx=20)

Theme Selector

def change_theme(theme):
    print(f"Changing theme to: {theme}")
    if theme == "Dark":
        ctk.set_appearance_mode("dark")
    elif theme == "Light":
        ctk.set_appearance_mode("light")
    else:
        ctk.set_appearance_mode("system")

theme_menu = ctk.CTkOptionMenu(
    root,
    values=["System", "Light", "Dark"],
    command=change_theme
)
theme_menu.pack(pady=20)
theme_menu.set("System")

Fixed Width OptionMenu

optionmenu = ctk.CTkOptionMenu(
    root,
    values=["Short", "Medium Length", "Very Long Option Name"],
    width=250,
    dynamic_resizing=False  # Fixed width
)
optionmenu.pack(pady=20, padx=20)

Center-aligned OptionMenu

optionmenu = ctk.CTkOptionMenu(
    root,
    values=["Left", "Center", "Right"],
    anchor="center"
)
optionmenu.pack(pady=20, padx=20)

Country Selector

countries = [
    "United States",
    "United Kingdom",
    "Canada",
    "Australia",
    "Germany",
    "France"
]

def on_country_selected(country):
    print(f"Selected country: {country}")

country_menu = ctk.CTkOptionMenu(
    root,
    values=countries,
    command=on_country_selected,
    width=200
)
country_menu.pack(pady=20)
country_menu.set("United States")

Disabled OptionMenu

optionmenu = ctk.CTkOptionMenu(
    root,
    values=["Option 1", "Option 2"],
    state=ctk.DISABLED
)
optionmenu.set("Option 1")
optionmenu.pack(pady=20)

Build docs developers (and LLMs) love