






















Entry(输入框)
单行文本输入,支持验证
tk.Entry 与 ttk.Entryentry_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(单行输入框)的创建与基本操作,包括绑定变量、焦点控制、插入/获取/删除文本。下面逐句解释:
username = tk.StringVar()
StringVar 是 Tkinter 的变量类,用于实现 Python 与控件之间的 双向数据绑定。username 用于存储输入框的文本内容,初始值为空字符串 ""。entry = ttk.Entry(root, textvariable=username, width=30)
ttk.Entry:主题化的单行输入控件。root:父容器(通常是主窗口)。textvariable=username:将输入框与 username 绑定。
username 自动更新为输入内容。username.set(...) 时,输入框也会自动刷新显示新值。width=30:输入框宽度为 30 个字符(不是像素)。entry.pack(pady=8)
pack 布局,并添加上下各 8 像素的外边距。entry.focus_set()
entry.insert(0, "你好") # 在开头插入
entry.insert(tk.END, " 世界") # 在末尾追加
insert(index, string) 在指定位置插入字符串。
0 或 tk.INSERT 表示光标当前位置,此处 0 明确指定开头。tk.END 表示末尾。value = entry.get() # 获取内容:"你好 世界"
get() 方法返回输入框的当前全部文本,赋值给变量 value。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 添加了输入验证功能,确保用户只能输入有效的整数(支持负数和空值)。下面逐行拆解:
def only_integers(new_value):
return new_value == "" or new_value.lstrip("-").isdigit()
new_value:这是将由 Tkinter 传入的待验证的新值(即用户本次输入后输入框将变成的内容)。new_value 为空字符串 "",允许(用户可以删除所有内容,不强制必须有值)。-(.lstrip("-")),然后检查剩余部分是否全是数字(.isdigit())。True 表示允许本次更改生效;返回 False 则拒绝更改(输入框内容恢复为之前的值)。vcmd = root.register(only_integers)
root.register() 将 Python 函数 only_integers 注册为 Tcl 回调。Tkinter 底层基于 Tcl/Tk,验证命令必须由 Tcl 解释器调用,因此需要先注册,返回一个字符串形式的 Tcl 命令名(如 "0000000001only_integers")。validatecommand 选项需要传递一个可被 Tcl 调用的命令。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)。only_integers 时,会自动将 "%P" 替换为当前的待验证新值,然后传入。当用户在输入框中按下一个键时:
%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()
这段代码实现了一个带“显示/隐藏密码”切换功能的密码输入框,通过一个复选框控制密码字符是否明文显示。下面逐段解释:
pw = tk.StringVar()
show = tk.BooleanVar(value=False)
pw:StringVar,用于存储密码输入框的文本内容(双向绑定)。show:BooleanVar,用于存储复选框的状态(是否显示密码),初始值为 False(隐藏密码)。pw_entry = ttk.Entry(root, textvariable=pw, show="●")
pw_entry.pack(pady=8)
ttk.Entry:创建输入框,父容器为 root。textvariable=pw:将输入框内容与 pw 变量绑定。show="●":设置回显字符为黑圆点 ●,输入的任何字符都会显示为 ●,起到密码掩码作用。pack(pady=8):布局,添加上下 8 像素外边距。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 "●"):
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: 避免传递参数,因为 command 回调不接受参数。●(密码模式)。*),可将 "●" 替换为 "*"。pw 变量始终保存真实输入)。show 初始值设为 True,并相应调整 pw_entry 的 show 选项(初始为 "")。此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。