如何让Python Tkinter Entry仅接受数字和下划线?
解决方案
你的代码存在几处核心问题:
- 验证逻辑错误:用匹配整串规则的正则去校验单个字符,完全不符合需求;
- 正则表达式错误:没有针对「数字+下划线分隔数字」的格式编写正确规则;
- 错误提示描述错误:误写为允许字母和下划线,实际需求是数字和下划线;
- 导入大量无关模块,代码冗余。
以下是修正后的代码,实现了仅允许数字和下划线输入,同时确保输入格式符合要求(不能以下划线开头/结尾、不能连续出现下划线):
import tkinter as tk from tkinter import ttk, messagebox import re root = tk.Tk() root.geometry("500x350") root.resizable(False, False) root.title('Test') Generator = tk.Frame(root) Generator.pack(padx=10, pady=10, fill='x', expand=True) Version = tk.StringVar() # 实时验证单个输入字符:仅允许数字和下划线 def validate_single_char(S): # 删除操作直接允许 if not S: return True # 检查字符是否为数字或下划线 return re.match(r'^[0-9_]$', S) is not None # 失去焦点时验证整体格式 def validate_full_content(): content = Version.get() # 正则规则:开头为数字,后续可跟任意多个「下划线+数字」的组合 if not re.match(r'^[0-9]+(_[0-9]+)*$', content): messagebox.showerror('版本错误', '仅允许数字和下划线,且不能以下划线开头/结尾或连续出现下划线') version_entry.delete(0, tk.END) version_entry.focus() return True # 注册验证命令 vcmd_single = (Generator.register(validate_single_char), '%S') version_label = ttk.Label(Generator, text="版本", font=('Helvetica', 10, 'bold')) version_label.pack(fill='x', expand=True) version_entry = ttk.Entry( Generator, textvariable=Version, validate='key', validatecommand=vcmd_single ) # 绑定失去焦点事件做整体格式校验 version_entry.bind('<FocusOut>', lambda e: validate_full_content()) version_entry.pack(fill='x', expand=True) version_entry.focus() root.mainloop()
代码说明
- 实时字符验证:通过
validate='key'触发按键验证,用%S获取当前输入的单个字符,直接阻止字母、减号等非法字符输入; - 整体格式验证:输入框失去焦点时,用正则校验整串内容,确保符合「数字开头、数字结尾、单个下划线分隔数字段」的规则,违规则弹出提示并清空输入框;
- 操作兼容性:删除字符的操作直接允许,不干扰正常编辑流程。
内容的提问来源于stack exchange,提问作者thangaraj1980
相关产品推荐
相关产品推荐

