






















Button(按钮)
可点击的操作和命令触发器
tk.Button 与 ttk.Buttonbutton_demo.py
ttk.Button(root, text="点击我", command=on_click).pack(pady=8)
# 加载状态模式
def on_submit():
btn.state(["disabled"])
btn.config(text="处理中…")
def done():
btn.config(text="提交")
btn.state(["!disabled"])
root.after(2000, done) # 模拟工作
btn = ttk.Button(root, text="提交", command=on_submit)
btn.pack(pady=12)
| 选项 | 说明 |
|---|---|
text |
按钮标签文字 |
command |
点击时调用的函数(不传递参数) |
textvariable |
提供标签内容的 StringVar 变量 |
image / compound |
图像与文字的排列方式 |
state |
normal/active/disabled(仅限 tk.Button);对于 ttk 请使用 state() 方法 |
width |
宽度(以字符数为单位) |
button.invoke() —— 以编程方式模拟按钮点击button.state(["disabled"]) —— ttk 状态标志(设置禁用)button.state(["!disabled"]) —— ttk 移除标志(前缀 ! 表示移除)这段代码展示了 Tkinter 中 按钮点击响应的两种常见模式:一是简单的命令绑定,二是“加载状态”防重复点击模式(提升用户体验)。下面逐段拆解:
ttk.Button(root, text="点击我", command=on_click).pack(pady=8)
on_click 函数。on_click 函数已在前面定义(例如 def on_click(): print("被点了")),否则程序会报错 NameError。pack 布局,添加 8 像素垂直外间距。def on_submit():
btn.state(["disabled"])
btn.config(text="处理中…")
def done():
btn.config(text="提交")
btn.state(["!disabled"])
root.after(2000, done)
btn = ttk.Button(root, text="提交", command=on_submit)
btn.pack(pady=12)
这段代码解决了一个常见痛点:用户点击提交按钮后,如果后端处理耗时较长,用户可能会疯狂反复点击,导致重复提交或界面卡死。
on_submit() 函数。btn.state(["disabled"]):将按钮状态设为“禁用”(灰色不可点)。btn.config(text="处理中…"):按钮文字变为“处理中…”,给用户视觉反馈“正在干活”。done(闭包):
on_submit 内部,可以访问外部的 btn 变量。["!disabled"],! 前缀表示移除该状态)。root.after(2000, done):告诉 Tkinter 在 2000 毫秒(2秒)后执行 done 函数。这里有一个关键点需要留意:定义 btn 在前,还是定义 on_submit 在前?
代码中是先定义 on_submit(函数),后创建 btn(变量)。
def on_submit():
btn.state(["disabled"]) # 这里引用了 btn,但此时 btn 还没定义!
...
btn = ttk.Button(...) # 后定义
btn 变量已经被创建并赋值,代码就能正常运行。command=on_submit 将函数对象传给了按钮。当 2 秒后用户(或模拟完成)触发点击时,btn 早已存在于内存中,所以不会报错。ttk.Button 状态语法说明| 方法 | 含义 |
|---|---|
btn.state(["disabled"]) |
添加 disabled 状态(按钮变灰不可点) |
btn.state(["!disabled"]) |
移除 disabled 状态(恢复可点击) |
| 其他状态 | ["pressed"](按下)、["focus"](聚焦)等 |
try...finally 中确保按钮恢复启用,防止因错误导致按钮永远“卡死”。root.after 换成真实的线程 + 进度条更新,替代单纯的文字提示。此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。