Tkinter - Entry 输入框组件
Entry(输入框)
单行文本输入,支持验证
tk.Entry 与 ttk.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)在指定位置插入字符串。0或tk.INSERT表示光标当前位置,此处0明确指定开头。tk.END表示末尾。
- 先在开头插入 "你好",再在末尾追加 " 世界",最终内容为 "你好 世界"。
5. 获取内容
value = entry.get() # 获取内容:"你好 世界"
get()方法返回输入框的当前全部文本,赋值给变量value。
6. 删除(清空)内容
entry.delete(0, tk.END) # 清空全部内容
delete(from, to)删除从from到to(不包含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"替换为当前的待验证新值,然后传入。
验证流程(重要)
当用户在输入框中按下一个键时:
- Tkinter 捕获按键事件。
- 它计算出应用本次按键后输入框会变成的值(即
%P)。 - 调用验证函数(
only_integers),并传入该新值。 - 如果函数返回
True,本次更改生效,输入框更新。 - 如果返回
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"))
更多替换符请参考官方文档(之前的翻译中已列出)。
整体运行效果
- 用户只能输入数字和开头的负号(实际上负数只允许在开头有一个负号,且后面全是数字)。
- 输入其他字符被自动忽略。
- 允许输入框为空(方便用户删除所有内容后重新输入)。
注意事项
- 验证函数不要修改输入框内容(如调用
set或insert),否则可能触发无限循环。 - 如果希望限制必须为纯正整数(不允许负号),可直接用
new_value.isdigit(),并去掉空值判断(或设置允许空)。 validatecommand是ttk.Entry和tk.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)
pw:StringVar,用于存储密码输入框的文本内容(双向绑定)。show:BooleanVar,用于存储复选框的状态(是否显示密码),初始值为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():将复选框布局到父容器。
整体工作流程
- 初始状态:
show为False,密码输入框的show="●",用户输入的字符显示为圆点,密码被隐藏。 - 用户勾选“显示密码”:
- 复选框状态变为
True,show变量同步更新。 command中的 lambda 被触发,show.get()为True,执行pw_entry.config(show=""),输入框显示明文。
- 复选框状态变为
- 用户取消勾选:
- 复选框状态变为
False,lambda 再次触发,此时show.get()为False,执行pw_entry.config(show="●"),恢复掩码。
- 复选框状态变为
关键点
- 动态修改
show选项:ttk.Entry的show属性可随时通过config()更改,实现掩码与明文的切换。 - 双向绑定:
pw变量存储真实密码内容,无论掩码如何变化,pw.get()始终返回实际输入的字符,便于后续使用(如提交登录)。 - 复选框状态同步:
variable=show使得复选框的勾选状态与show变量保持同步,因此command中可以直接读取show.get()判断当前状态。 - 无参 lambda:使用
lambda:避免传递参数,因为command回调不接受参数。
运行效果
- 窗口出现一个输入框,默认显示
●(密码模式)。 - 下方有一个“显示密码”复选框。
- 勾选复选框,输入框内容立即变为明文;取消勾选,立即恢复为圆点掩码。
注意事项
- 如果希望使用更复杂的回显字符(如
*),可将"●"替换为"*"。 - 此实现完全在前端控制,仅改变显示效果,不影响实际存储的密码值(
pw变量始终保存真实输入)。 - 如果希望初始就明文显示,可将
show初始值设为True,并相应调整pw_entry的show选项(初始为"")。

浙公网安备 33010602011771号