Recently in a webinar, someone asked me how to validate user input in Python Tkinter applications. Input validation is important to ensure that users enter the correct data format and prevent errors in the application. Tkinter provides several ways to validate user input Let us learn some important methods with suitable examples.
Python Tkinter Validation Options
Tkinter provides two main options for validating user input in entry widgets:
validate: Specifies when the validation should occur (e.g., on focus out, key press, etc.)validatecommand: A function that returnsTrueif the input is valid andFalseotherwise
Here’s an example of how to use these options to validate that a user enters only digits in an entry widget:
import tkinter as tk
def validate_input(value):
return value.isdigit()
root = tk.Tk()
entry = tk.Entry(root, validate="key", validatecommand=(root.register(validate_input), '%P'))
entry.pack()
root.mainloop()In this example, the validate option is set to "key", which means the validation will occur on each key press. The validatecommand option is set to a tuple containing the registered validation function and the '%P' substitution, which represents the new value of the entry widget.
Read How to Create GUI Layouts with Python Tkinter Separator?
Validate User Input in Python Tkinter
Now let’s get into some specific examples of how to validate user input in Tkinter applications.
1. Validate Integer Input
To validate that a user enters only integers, you can use the following validation function:
def validate_integer(value):
if value.isdigit():
return True
elif value == "":
return True
else:
return FalseThis function returns True if the input is a digit or an empty string (to allow deletion) and False otherwise.
Check out How to Add Functions to Python Tkinter?
2. Validate Floating-Point Input
To validate floating-point input, you can modify the previous example to allow a single decimal point:
def validate_float(value):
if value.replace('.', '', 1).isdigit():
return True
elif value == "":
return True
else:
return False3. Validate Date Input (MM/DD/YYYY)
To validate a date in the format MM/DD/YYYY, you can use the following function:
import re
def validate_date(value):
pattern = re.compile(r"^\d{2}/\d{2}/\d{4}$")
if pattern.match(value):
return True
elif value == "":
return True
else:
return FalseThis function uses a regular expression to check if the input matches the MM/DD/YYYY format.
Read How to Create a Filter() Function in Python Tkinter?
4. Validate Email Input
To validate an email address, you can use a regular expression:
import re
def validate_email(value):
pattern = re.compile(r"^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$")
if pattern.match(value):
return True
elif value == "":
return True
else:
return False5. Validate US Phone Number Input
To validate a US phone number in the format (XXX) XXX-XXXX, you can use the following function:
import re
def validate_phone(value):
pattern = re.compile(r"^\(\d{3}\)\s\d{3}-\d{4}$")
if pattern.match(value):
return True
elif value == "":
return True
else:
return FalseCheck out How to Create a Python Tkinter Panel with Search Functionality?
6. Validate US ZIP Code Input
To validate a US ZIP code (5 digits), you can use:
def validate_zip(value):
if len(value) == 5 and value.isdigit():
return True
elif value == "":
return True
else:
return False7. Validate US State Abbreviations
To validate US state abbreviations (e.g., CA, NY, TX), you can use:
us_states = ["AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA",
"HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD",
"MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ",
"NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC",
"SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY"]
def validate_state(value):
if value.upper() in us_states:
return True
elif value == "":
return True
else:
return FalseRead How to Create Scrollable Frames with Python Tkinter?
8. Validate Password Strength
To validate password strength (e.g., at least 8 characters, containing letters, numbers, and special characters), you can use:
import re
def validate_password(value):
pattern = re.compile(r"^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$")
if pattern.match(value):
return True
elif value == "":
return True
else:
return False9. Validate Credit Card Number Input
To validate a credit card number (16 digits, allowing spaces), you can use:
import re
def validate_credit_card(value):
pattern = re.compile(r"^(\d{4}\s?){3}\d{4}$")
if pattern.match(value):
return True
elif value == "":
return True
else:
return FalseCheck out How to Use Colors in Python Tkinter?
10. Validate URL Input
To validate a URL, you can use the following function:
import re
def validate_url(value):
pattern = re.compile(r"^(http|https)://[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,})$")
if pattern.match(value):
return True
elif value == "":
return True
else:
return FalseRead How to Add Characters to a String in Python?
Put It All Together
Now that we’ve covered various validation examples, let’s create a sample Tkinter application that demonstrates how to use these validation functions:
import tkinter as tk
# Validation functions (defined earlier)
# ...
root = tk.Tk()
root.title("Input Validation Examples")
# Integer validation
int_label = tk.Label(root, text="Enter an integer:")
int_label.pack()
int_entry = tk.Entry(root, validate="key", validatecommand=(root.register(validate_integer), '%P'))
int_entry.pack()
# Floating-point validation
float_label = tk.Label(root, text="Enter a float:")
float_label.pack()
float_entry = tk.Entry(root, validate="key", validatecommand=(root.register(validate_float), '%P'))
float_entry.pack()
# Date validation
date_label = tk.Label(root, text="Enter a date (MM/DD/YYYY):")
date_label.pack()
date_entry = tk.Entry(root, validate="focusout", validatecommand=(root.register(validate_date), '%P'))
date_entry.pack()
# Email validation
email_label = tk.Label(root, text="Enter an email address:")
email_label.pack()
email_entry = tk.Entry(root, validate="focusout", validatecommand=(root.register(validate_email), '%P'))
email_entry.pack()
# US phone number validation
phone_label = tk.Label(root, text="Enter a US phone number ((XXX) XXX-XXXX):")
phone_label.pack()
phone_entry = tk.Entry(root, validate="focusout", validatecommand=(root.register(validate_phone), '%P'))
phone_entry.pack()
# US ZIP code validation
zip_label = tk.Label(root, text="Enter a US ZIP code:")
zip_label.pack()
zip_entry = tk.Entry(root, validate="focusout", validatecommand=(root.register(validate_zip), '%P'))
zip_entry.pack()
# US state validation
state_label = tk.Label(root, text="Enter a US state abbreviation:")
state_label.pack()
state_entry = tk.Entry(root, validate="focusout", validatecommand=(root.register(validate_state), '%P'))
state_entry.pack()
# Password strength validation
password_label = tk.Label(root, text="Enter a strong password:")
password_label.pack()
password_entry = tk.Entry(root, show="*", validate="focusout", validatecommand=(root.register(validate_password), '%P'))
password_entry.pack()
# Credit card number validation
cc_label = tk.Label(root, text="Enter a credit card number:")
cc_label.pack()
cc_entry = tk.Entry(root, validate="focusout", validatecommand=(root.register(validate_credit_card), '%P'))
cc_entry.pack()
# URL validation
url_label = tk.Label(root, text="Enter a URL:")
url_label.pack()
url_entry = tk.Entry(root, validate="focusout", validatecommand=(root.register(validate_url), '%P'))
url_entry.pack()
root.mainloop()This application demonstrates how to use the various validation functions with Tkinter entry widgets. Each entry widget has a specific validation function assigned to it, and the validation is triggered either on each key press ("key") or when the widget loses focus ("focusout").
You can look at the output in the screenshot below.

Check out How to Do Case-Insensitive String Comparisons in Python?
Conclusion
In this tutorial, I helped to learn how to validate user input in Python Tkinter. I discussed an example to validate user input in Python Tkinter step-by-step and by putting it all together we run the code successfully.
You may like to read:
- How to Create Labels in Python with Tkinter?
- How to Create Buttons in Python with Tkinter?
- How to Create a Menu Bar in Tkinter?

I am Bijay Kumar, a Microsoft MVP in SharePoint. Apart from SharePoint, I started working on Python, Machine learning, and artificial intelligence for the last 5 years. During this time I got expertise in various Python libraries also like Tkinter, Pandas, NumPy, Turtle, Django, Matplotlib, Tensorflow, Scipy, Scikit-Learn, etc… for various clients in the United States, Canada, the United Kingdom, Australia, New Zealand, etc. Check out my profile.