How to detect when an OptionMenu or Checkbutton changes in Tkinter?

In Tkinter applications, you often need to detect when a user selects an option from a dropdown menu or clicks a checkbutton. This is useful for updating the interface or performing actions based on user choices.

Detecting OptionMenu Changes

The OptionMenu widget allows users to select from a dropdown list of options. You can detect changes using a callback function with the command parameter ?

Syntax

OptionMenu(parent, variable, *choices, command=callback_function)

Example

import tkinter as tk
from tkinter import *

# Create main window
root = tk.Tk()
root.geometry("400x200")
root.title("OptionMenu Change Detection")

# Callback function for OptionMenu
def option_changed(selected_value):
    print(f"Selected option: {selected_value}")
    label.config(text=f"You selected: {selected_value}")

# Create variable and options
var = StringVar()
var.set("1")  # Default value
options = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]

# Create OptionMenu
option_menu = OptionMenu(root, var, *options, command=option_changed)
option_menu.pack(pady=20)

# Label to display selection
label = Label(root, text="You selected: 1", font=("Arial", 12))
label.pack(pady=10)

root.mainloop()

Detecting Checkbutton Changes

For Checkbuttons, use the command parameter to specify a callback function that executes when the button is clicked ?

import tkinter as tk
from tkinter import *

# Create main window
root = tk.Tk()
root.geometry("400x200")
root.title("Checkbutton Change Detection")

# Callback function for Checkbutton
def checkbox_changed():
    if check_var.get():
        print("Checkbox is checked")
        status_label.config(text="Status: Checked", fg="green")
    else:
        print("Checkbox is unchecked")
        status_label.config(text="Status: Unchecked", fg="red")

# Create variable for checkbox
check_var = BooleanVar()

# Create Checkbutton
checkbox = Checkbutton(root, text="Enable notifications", 
                      variable=check_var, command=checkbox_changed)
checkbox.pack(pady=20)

# Label to show status
status_label = Label(root, text="Status: Unchecked", 
                    font=("Arial", 12), fg="red")
status_label.pack(pady=10)

root.mainloop()

Using trace() Method for Advanced Detection

You can also use the trace() method on variables to detect changes automatically ?

import tkinter as tk
from tkinter import *

root = tk.Tk()
root.geometry("400x250")
root.title("Advanced Change Detection")

# Callback function using trace
def variable_changed(*args):
    selected = option_var.get()
    checked = check_var.get()
    print(f"Option: {selected}, Checkbox: {checked}")
    result_label.config(text=f"Option: {selected}, Checkbox: {'Yes' if checked else 'No'}")

# Variables
option_var = StringVar(value="Red")
check_var = BooleanVar()

# Set up tracing
option_var.trace("w", variable_changed)
check_var.trace("w", variable_changed)

# Create widgets
Label(root, text="Choose a color:", font=("Arial", 10)).pack(pady=5)
OptionMenu(root, option_var, "Red", "Green", "Blue", "Yellow").pack(pady=5)

Checkbutton(root, text="Make it bold", variable=check_var).pack(pady=10)

result_label = Label(root, text="Option: Red, Checkbox: No", 
                    font=("Arial", 12), bg="lightgray")
result_label.pack(pady=20, fill="x")

root.mainloop()

Comparison

Method Best For Advantage
command parameter Simple event handling Direct and straightforward
trace() method Advanced monitoring Automatic detection of any variable change

Conclusion

Use the command parameter for simple change detection in OptionMenu and Checkbutton widgets. For more advanced scenarios, the trace() method provides automatic monitoring of variable changes.

Updated on: 2026-03-25T16:52:55+05:30

3K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements