Entry 的 show 参数不能直接切换显示状态,因为它是只读配置项,修改后不会重绘已有文本,仅影响后续输入;正确做法是先获取内容、清空再重新插入,并重置 show 值。

为什么 Entry 的 show 参数不能直接切换显示状态?
因为 show 是一个只读属性(实际是配置项),修改它不会自动刷新已输入的字符渲染——Tkinter 不会重绘已有文本,只会对后续输入生效。如果你只是动态改 entry.config(show=""),光标后新打的字才可见,前面仍是圆点。
正确做法是先保存当前内容,清空再重新插入,同时重置 show 值:
- 用
entry.get()获取原始字符串(明文或密文都一样,get()总返回真实值) - 调用
entry.delete(0, "end")清空显示缓冲 - 再用
entry.insert(0, text)插入相同内容 - 最后设
entry.config(show="")或entry.config(show="•")
如何用复选框控制密码可见性?
绑定 Checkbutton 的 command 到一个切换函数,避免用 IntVar 的 trace——它会在初始化时触发一次无意义回调,还可能和用户操作不同步。
示例逻辑:
立即学习“Python免费学习笔记(深入)”;
华为云 Python SDK 查询工具。自动发现已安装 SDK 的服务包、Client类、API 方法、入参详情、类信息(__init__ 参数、属性、类型、描述),支持关键字搜索,快速定位目标 API 使用方法。
def toggle_password():
if show_var.get():
entry.config(show="")
else:
entry.config(show="•")
# 必须手动刷新一次内容,否则旧字符不重绘
text = entry.get()
entry.delete(0, "end")
entry.insert(0, text)
<p>show_var = tk.BooleanVar()
cb = tk.Checkbutton(root, text="显示密码", variable=show_var, command=toggle_password)
点击眼睛图标按钮实现切换更可靠吗?
比复选框更直观,也更容易避免误触;但要注意图标的视觉反馈必须同步更新——比如用两个 PhotoImage 对象切换,且必须保持引用(否则被 GC 回收导致图标消失)。
关键细节:
- 不要在回调里反复
tk.PhotoImage(file=...),每次都会新建对象并可能泄漏 - 提前加载两个图标:
eye_open_img和eye_closed_img,存为实例变量或全局变量 - 按钮的
image属性需用button.config(image=...)动态替换 - 同样要执行“取值→清空→重插”三步,否则显示不同步
为什么在 macOS 上圆点显示异常?
Tkinter 默认的 show="•" 在 macOS 的 Aqua 主题下可能渲染成方块或空白,这是 Tk 的字体回退问题。临时解法是显式指定字体,并用 Unicode 圆圈字符替代:
entry.config(show="●", font=("Helvetica", 12))
更稳妥的方式是统一用 show="*",虽然不是圆点,但跨平台一致;或者用自定义验证器 + 按键拦截模拟掩码,但代价是失去系统级密码处理能力(如 Cmd+V 粘贴后自动隐藏)。普通登录表单,"*" 已足够。
真正容易被忽略的是:切换前后焦点是否仍在输入框内——如果用了 entry.focus_set() 却没加 entry.lift(),在多窗口场景下可能焦点无效。别省这行代码。

















