You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Python Tkinter Entry仅接受数字和下划线?

解决方案

你的代码存在几处核心问题:

  1. 验证逻辑错误:用匹配整串规则的正则去校验单个字符,完全不符合需求;
  2. 正则表达式错误:没有针对「数字+下划线分隔数字」的格式编写正确规则;
  3. 错误提示描述错误:误写为允许字母和下划线,实际需求是数字和下划线;
  4. 导入大量无关模块,代码冗余。

以下是修正后的代码,实现了仅允许数字和下划线输入,同时确保输入格式符合要求(不能以下划线开头/结尾、不能连续出现下划线):

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()

代码说明

  1. 实时字符验证:通过validate='key'触发按键验证,用%S获取当前输入的单个字符,直接阻止字母、减号等非法字符输入;
  2. 整体格式验证:输入框失去焦点时,用正则校验整串内容,确保符合「数字开头、数字结尾、单个下划线分隔数字段」的规则,违规则弹出提示并清空输入框;
  3. 操作兼容性:删除字符的操作直接允许,不干扰正常编辑流程。

内容的提问来源于stack exchange,提问作者thangaraj1980

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:43:12