Tkinter - Entry 输入框组件

Entry(输入框)
单行文本输入,支持验证


tk.Entryttk.Entry

entry_demo.py

username = tk.StringVar()
entry = ttk.Entry(root, textvariable=username, width=30)
entry.pack(pady=8)
entry.focus_set()   # 将键盘焦点赋予该输入框

# 方法
entry.insert(0, "你好")        # 在开头插入
entry.insert(tk.END, " 世界")   # 在末尾追加
value = entry.get()            # 获取内容:"你好 世界"
entry.delete(0, tk.END)        # 清空全部内容

这段代码演示了 ttk.Entry(单行输入框)的创建与基本操作,包括绑定变量、焦点控制、插入/获取/删除文本。下面逐句解释:


1. 创建 Tk 变量

username = tk.StringVar()
  • StringVar 是 Tkinter 的变量类,用于实现 Python 与控件之间的 双向数据绑定
  • 此处 username 用于存储输入框的文本内容,初始值为空字符串 ""

2. 创建输入框

entry = ttk.Entry(root, textvariable=username, width=30)
  • ttk.Entry:主题化的单行输入控件。
  • root:父容器(通常是主窗口)。
  • textvariable=username:将输入框与 username 绑定。
    • 用户输入时,username 自动更新为输入内容。
    • 程序修改 username.set(...) 时,输入框也会自动刷新显示新值。
  • width=30:输入框宽度为 30 个字符(不是像素)。

3. 布局并设置焦点

entry.pack(pady=8)
  • 将输入框放入父容器,采用 pack 布局,并添加上下各 8 像素的外边距。
entry.focus_set()
  • 键盘焦点设置到此输入框,程序启动后光标自动定位在此处,用户无需鼠标点击即可直接打字。

4. 插入文本

entry.insert(0, "你好")        # 在开头插入
entry.insert(tk.END, " 世界")   # 在末尾追加
  • insert(index, string) 在指定位置插入字符串。
    • 0tk.INSERT 表示光标当前位置,此处 0 明确指定开头。
    • tk.END 表示末尾。
  • 先在开头插入 "你好",再在末尾追加 " 世界",最终内容为 "你好 世界"

5. 获取内容

value = entry.get()            # 获取内容:"你好 世界"
  • get() 方法返回输入框的当前全部文本,赋值给变量 value

6. 删除(清空)内容

entry.delete(0, tk.END)        # 清空全部内容
  • delete(from, to) 删除从 fromto不包含 to)之间的字符。
  • 0 表示起始,tk.END 表示末尾,因此会删除整个文本,清空输入框。

关键要点

  • 双向绑定:使用 textvariable 后,entry.get()username.get() 获取的内容始终一致。修改 username 也会立刻反映在输入框中。
  • 焦点设置focus_set() 提升用户体验,启动即可输入。
  • 插入/删除:操作基于字符索引,0 是第一个字符位置,tk.END 是末尾哨兵。
  • 所有操作(插入、获取、删除)都立即生效,且会同步更新绑定的 StringVar

运行效果

  • 窗口出现一个输入框,光标闪烁其中。
  • 程序自动填入 "你好 世界",然后读取并打印(虽未显示打印语句),最后清空输入框。

注意事项

  • 如果输入框已经用 textvariable 绑定,insert/delete 后,username 会自动同步,因此后续使用 username.get() 也会得到更新后的值,但代码中直接使用 entry.get() 更明确。
  • 插入操作应在 mainloop() 启动之前之后(例如按钮回调中)执行,均有效。此处是在启动前执行的。

验证 —— 仅允许整数

validate_int.py

def only_integers(new_value):
    return new_value == "" or new_value.lstrip("-").isdigit()

vcmd = root.register(only_integers)
ttk.Entry(root,
    validate="key",
    validatecommand=(vcmd, "%P")).pack(padx=20, pady=20)

验证替换符

代码 含义
%P 如果允许本次更改,输入框将变成的新值
%s 更改前的当前值
%S 正在插入或删除的文本内容
%d 操作类型:1=插入,0=删除,-1=其他
%i 更改发生的位置索引
%V 触发源:key / focusin / focusout / forced

这段代码为 ttk.Entry 添加了输入验证功能,确保用户只能输入有效的整数(支持负数和空值)。下面逐行拆解:


1. 验证函数

def only_integers(new_value):
    return new_value == "" or new_value.lstrip("-").isdigit()
  • new_value:这是将由 Tkinter 传入的待验证的新值(即用户本次输入后输入框将变成的内容)。
  • 逻辑:
    • 如果 new_value 为空字符串 "",允许(用户可以删除所有内容,不强制必须有值)。
    • 否则,先去除开头的负号 -.lstrip("-")),然后检查剩余部分是否全是数字(.isdigit())。
  • 返回 True 表示允许本次更改生效;返回 False 则拒绝更改(输入框内容恢复为之前的值)。

2. 注册验证回调

vcmd = root.register(only_integers)
  • root.register() 将 Python 函数 only_integers 注册为 Tcl 回调。Tkinter 底层基于 Tcl/Tk,验证命令必须由 Tcl 解释器调用,因此需要先注册,返回一个字符串形式的 Tcl 命令名(如 "0000000001only_integers")。
  • 这个注册是必需的,因为 validatecommand 选项需要传递一个可被 Tcl 调用的命令。

3. 创建带验证的输入框

ttk.Entry(root,
    validate="key",
    validatecommand=(vcmd, "%P")).pack(padx=20, pady=20)
  • validate="key":指定触发验证的时机"key" 表示每次用户按键(插入或删除字符)时都会触发验证。
    • 其他可选值:"focusin"(获得焦点时)、"focusout"(失去焦点时)、"all"(所有情况)、"none"(不验证)。
  • validatecommand=(vcmd, "%P"):这是一个元组,第一个元素是注册命令名 vcmd,后续元素是传给验证函数的参数替换符
    • "%P" 是一个特殊的替换符,表示如果本次更改被允许,输入框即将变成的新值(即我们验证函数需要的 new_value)。
    • Tkinter 在调用 only_integers 时,会自动将 "%P" 替换为当前的待验证新值,然后传入。

验证流程(重要)

当用户在输入框中按下一个键时:

  1. Tkinter 捕获按键事件。
  2. 它计算出应用本次按键后输入框会变成的值(即 %P)。
  3. 调用验证函数(only_integers),并传入该新值。
  4. 如果函数返回 True,本次更改生效,输入框更新。
  5. 如果返回 False,更改被拒绝,输入框内容保持不变。

举例:

  • 输入框当前为 "12",用户按下 "3"。新值 "%P""123"only_integers("123") 返回 True,接受。
  • 用户按下 "a"。新值 "123a"only_integers("123a") 返回 False,拒绝,输入框仍为 "123"
  • 用户按下 "-",新值 "123-".lstrip("-") 后为 "123-"isdigit()False,拒绝(不允许负号在中间)。
  • 用户按下 Backspace,新值可能为 "12",验证通过。

其他常用替换符

除了 %P,验证函数可以接收多个参数,每个参数对应一个替换符。例如:

def validate(new_value, current_value, action_type):
    # new_value = %P, current_value = %s, action_type = %d
    ...

vcmd = root.register(validate)
entry.config(validatecommand=(vcmd, "%P", "%s", "%d"))

更多替换符请参考官方文档(之前的翻译中已列出)。


整体运行效果

  • 用户只能输入数字和开头的负号(实际上负数只允许在开头有一个负号,且后面全是数字)。
  • 输入其他字符被自动忽略。
  • 允许输入框为空(方便用户删除所有内容后重新输入)。

注意事项

  • 验证函数不要修改输入框内容(如调用 setinsert),否则可能触发无限循环。
  • 如果希望限制必须为纯正整数(不允许负号),可直接用 new_value.isdigit(),并去掉空值判断(或设置允许空)。
  • validatecommandttk.Entrytk.Entry 都支持的选项。

补充:高级用法

如果需要更复杂的规则(如限制长度、范围等),可以在验证函数中添加相应逻辑:

def int_in_range(new_value):
    if new_value == "":
        return True
    if not (new_value.lstrip("-").isdigit()):
        return False
    val = int(new_value)
    return -100 <= val <= 100

然后注册并使用即可。


密码输入框

password.py

pw = tk.StringVar()
show = tk.BooleanVar(value=False)
pw_entry = ttk.Entry(root, textvariable=pw, show="●")
pw_entry.pack(pady=8)

ttk.Checkbutton(root, text="显示密码", variable=show,
    command=lambda: pw_entry.config(show="" if show.get() else "●")).pack()

这段代码实现了一个带“显示/隐藏密码”切换功能的密码输入框,通过一个复选框控制密码字符是否明文显示。下面逐段解释:


1. 创建变量

pw = tk.StringVar()
show = tk.BooleanVar(value=False)
  • pwStringVar,用于存储密码输入框的文本内容(双向绑定)。
  • showBooleanVar,用于存储复选框的状态(是否显示密码),初始值为 False(隐藏密码)。

2. 创建密码输入框

pw_entry = ttk.Entry(root, textvariable=pw, show="●")
pw_entry.pack(pady=8)
  • ttk.Entry:创建输入框,父容器为 root
  • textvariable=pw:将输入框内容与 pw 变量绑定。
  • show="●":设置回显字符为黑圆点 ,输入的任何字符都会显示为 ,起到密码掩码作用。
  • pack(pady=8):布局,添加上下 8 像素外边距。

3. 创建“显示密码”复选框

ttk.Checkbutton(root, text="显示密码", variable=show,
    command=lambda: pw_entry.config(show="" if show.get() else "●")).pack()
  • ttk.Checkbutton:复选框控件。
  • text="显示密码":复选框旁边的文本标签。
  • variable=show:将复选框的选中状态(布尔值)与 show 变量双向绑定。勾选时 show.get()True,取消勾选为 False
  • command=lambda: pw_entry.config(show="" if show.get() else "●")
    • 当复选框被点击(状态改变)时执行此 lambda 函数。
    • 函数逻辑:如果 show.get()True(勾选),则通过 pw_entry.config(show="") 将密码输入框的 show 选项设为空字符串,即明文显示实际输入的字符;否则设为 "●",恢复掩码。
  • .pack():将复选框布局到父容器。

整体工作流程

  1. 初始状态:showFalse,密码输入框的 show="●",用户输入的字符显示为圆点,密码被隐藏。
  2. 用户勾选“显示密码”:
    • 复选框状态变为 Trueshow 变量同步更新。
    • command 中的 lambda 被触发,show.get()True,执行 pw_entry.config(show=""),输入框显示明文。
  3. 用户取消勾选:
    • 复选框状态变为 False,lambda 再次触发,此时 show.get()False,执行 pw_entry.config(show="●"),恢复掩码。

关键点

  • 动态修改 show 选项ttk.Entryshow 属性可随时通过 config() 更改,实现掩码与明文的切换。
  • 双向绑定pw 变量存储真实密码内容,无论掩码如何变化,pw.get() 始终返回实际输入的字符,便于后续使用(如提交登录)。
  • 复选框状态同步variable=show 使得复选框的勾选状态与 show 变量保持同步,因此 command 中可以直接读取 show.get() 判断当前状态。
  • 无参 lambda:使用 lambda: 避免传递参数,因为 command 回调不接受参数。

运行效果

  • 窗口出现一个输入框,默认显示 (密码模式)。
  • 下方有一个“显示密码”复选框。
  • 勾选复选框,输入框内容立即变为明文;取消勾选,立即恢复为圆点掩码。

注意事项

  • 如果希望使用更复杂的回显字符(如 *),可将 "●" 替换为 "*"
  • 此实现完全在前端控制,仅改变显示效果,不影响实际存储的密码值(pw 变量始终保存真实输入)。
  • 如果希望初始就明文显示,可将 show 初始值设为 True,并相应调整 pw_entryshow 选项(初始为 "")。
posted @ 2026-07-21 07:33  箫笛  阅读(2)  评论(0)    收藏  举报