How to pass an argument to the event handler in Tkinter?

In most situations, callback functions can refer to Instance Methods. An instance method accesses all its members and performs operations with them without specifying any arguments.

However, there are cases where we need to pass arguments to event handlers. This is common when multiple components share similar functionality but need different parameters. Lambda functions provide an elegant solution for passing arguments to Tkinter event handlers.

Using Lambda Functions

Lambda functions create anonymous functions that can capture and pass arguments to event handlers. Here's how to pass arguments to button click events ?

import tkinter as tk
from tkinter import ttk

# Create main window
win = tk.Tk()
win.geometry("400x300")
win.title("Event Handler Arguments")

# Event handlers that accept arguments
def update_label(message):
    label.config(text=message)

def button_clicked(button_name, value):
    label.config(text=f"Button '{button_name}' clicked with value: {value}")

# Create label to display messages
label = tk.Label(win, text="Click a button", font=('Arial', 12))
label.pack(pady=20)

# Create buttons with lambda functions passing arguments
btn_low = ttk.Button(win, text="Low", 
                     command=lambda: update_label("This is Lower Value"))
btn_low.pack(pady=5)

btn_medium = ttk.Button(win, text="Medium", 
                        command=lambda: update_label("This is Medium Value"))
btn_medium.pack(pady=5)

btn_high = ttk.Button(win, text="High", 
                      command=lambda: update_label("This is Highest Value"))
btn_high.pack(pady=5)

# Button with multiple arguments
btn_custom = ttk.Button(win, text="Custom", 
                        command=lambda: button_clicked("Custom", 100))
btn_custom.pack(pady=5)

win.mainloop()

Alternative Method: Using Partial Functions

The functools.partial function provides another way to pass arguments to event handlers ?

import tkinter as tk
from tkinter import ttk
from functools import partial

win = tk.Tk()
win.geometry("400x250")
win.title("Using Partial Functions")

def handle_button(button_id, action):
    result_label.config(text=f"Button {button_id}: {action}")

result_label = tk.Label(win, text="No button clicked yet", font=('Arial', 10))
result_label.pack(pady=20)

# Using partial to create specialized functions
btn1 = ttk.Button(win, text="Save File", 
                  command=partial(handle_button, 1, "File Saved"))
btn1.pack(pady=5)

btn2 = ttk.Button(win, text="Load File", 
                  command=partial(handle_button, 2, "File Loaded"))
btn2.pack(pady=5)

btn3 = ttk.Button(win, text="Delete File", 
                  command=partial(handle_button, 3, "File Deleted"))
btn3.pack(pady=5)

win.mainloop()

Passing Widget References

You can also pass widget references as arguments to create more dynamic interactions ?

import tkinter as tk
from tkinter import ttk

win = tk.Tk()
win.geometry("400x200")

def modify_widget(widget, new_text):
    widget.config(text=new_text)

def toggle_state(widget):
    current_state = str(widget.cget('state'))
    new_state = 'disabled' if current_state == 'normal' else 'normal'
    widget.config(state=new_state)

# Create widgets
info_label = tk.Label(win, text="Original Text", bg="lightblue")
info_label.pack(pady=10)

target_button = ttk.Button(win, text="Target Button")
target_button.pack(pady=5)

# Buttons that modify other widgets
change_text_btn = ttk.Button(win, text="Change Label Text",
                             command=lambda: modify_widget(info_label, "Text Changed!"))
change_text_btn.pack(pady=5)

toggle_btn = ttk.Button(win, text="Toggle Button State",
                        command=lambda: toggle_state(target_button))
toggle_btn.pack(pady=5)

win.mainloop()

Comparison of Methods

Method Syntax Best For
Lambda lambda: function(args) Simple argument passing
Partial partial(function, args) Complex functions with many parameters
Wrapper Function def wrapper(): function(args) Complex logic before calling handler

Conclusion

Lambda functions provide the most common and readable way to pass arguments to Tkinter event handlers. Use partial for more complex scenarios with multiple parameters, and consider wrapper functions when additional logic is needed before calling the handler.

Updated on: 2026-03-25T19:33:20+05:30

2K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements