Tkinter中复选框取消勾选显示输入框、重新勾选自动隐藏的实现问题
问题根因
- 你绑定的鼠标点击事件
<Button-1>触发时,Checkbutton的选中状态还未完成更新,无法拿到最新的选中值做逻辑判断 - 每次触发回调都新建Label和Entry组件,没有对已创建的组件做状态管理,勾选状态恢复时自然不会自动消失
解决方案
推荐使用Checkbutton自带的command参数绑定回调(该回调会在选中状态更新完成后触发,逻辑更可靠),提前创建好要动态显示的组件,根据复选框的最新值控制组件的显示/隐藏即可:
from tkinter import * root = Tk() checkButtonVar = IntVar(value = 1) checkButtonIsChnaceDefault = Checkbutton(root, variable = checkButtonVar) labelIsChanceDefault = Label(root, text="Make chance = 0.9?") labelIsChanceDefault.grid(row=3, column = 0, sticky = 'w') checkButtonIsChnaceDefault.grid(row = 3, column = 1) # 提前创建动态组件,暂不布局 labelChance = Label(root, text = "Enter chance of winning") entryChance = Entry(root, borderwidth = 3) def checkCheckButton(): # 0为未勾选,1为已勾选 if checkButtonVar.get() == 0: # 未勾选时显示组件 labelChance.grid(row = 3, column = 2) entryChance.grid(row = 3, column = 3) else: # 勾选时隐藏组件,grid_remove会保留布局配置,下次显示直接调用grid()即可 labelChance.grid_remove() entryChance.grid_remove() # 用command绑定回调,无需绑定鼠标点击事件 checkButtonIsChnaceDefault.config(command=checkCheckButton) root.mainloop()
如果你的场景必须要动态创建组件而非提前创建,也可以通过全局变量标记组件的创建状态,勾选时调用destroy()方法销毁组件即可,不过这种反复创建销毁的方式性能低于提前创建控制显隐的方案。
内容的提问来源于stack exchange,提问作者bewop
相关产品推荐
相关产品推荐

