Tkinter Checkbox选中另一选项时无法自动取消原有选中状态问题
问题原因
- 你写的判断逻辑仅会在程序初始化加载代码时执行一次,后续点击复选框的操作没有绑定对应的触发逻辑,自然不会自动取消另一个选项的选中状态
Checkbutton组件本身默认允许多选,要实现互斥效果需要手动绑定选中事件的回调函数
修复实现方案
通过给复选框绑定command参数关联互斥判断函数,每次点击复选框时都会触发逻辑判断,实现二选一互斥效果:
from tkinter import * from tkinter import messagebox root = Tk() CheckVar1 = IntVar() CheckVar2 = IntVar() # 互斥判断回调函数 def mutually_exclusive(): if CheckVar1.get(): CheckVar2.set(0) elif CheckVar2.get(): CheckVar1.set(0) # 不需要未选中时弹窗可删除下面两行 else: messagebox.showerror('Tk', 'Something went wrong!') # 创建复选框时绑定回调函数 C1 = Checkbutton(root, text="Full Screen", variable=CheckVar1,onvalue = 1, offvalue = 0,height=5, width=20, command=mutually_exclusive) C1.pack(side=LEFT, pady=5, padx=2) C2 = Checkbutton(root, text="Area", variable=CheckVar2,onvalue = 1, offvalue = 0, height=5, width=20, command=mutually_exclusive) C2.pack(side=RIGHT,pady=5, padx=5) root.mainloop()
更优方案(原生支持互斥)
如果不需要保留复选框的样式,仅需要实现二选一的选择逻辑,更推荐使用Radiobutton单选框组件,同组单选框绑定同一个变量即可自动实现互斥,无需额外写逻辑:
from tkinter import * root = Tk() # 同组单选框共用同一个variable select_var = IntVar(value=1) # 默认选中第一个选项 R1 = Radiobutton(root, text="Full Screen", variable=select_var, value=1, height=5, width=20) R1.pack(side=LEFT, pady=5, padx=2) R2 = Radiobutton(root, text="Area", variable=select_var, value=2, height=5, width=20) R2.pack(side=RIGHT,pady=5, padx=5) root.mainloop()
内容的提问来源于stack exchange,提问作者Ly Nguyen
相关产品推荐
相关产品推荐

