实现点击一类单选按钮时清除另一类单选按钮组的选中状态
解决Tkinter中两组单选按钮互斥的问题
问题场景
我是Python GUI开发新手,正在开发一个单选答题表单,包含Analog Input和Digital Input两组单选按钮,要求两组选项不能同时选中:
- 点击Digital Input下的Rate或Link单选按钮时,清除Analog Input的选中状态及对应变量
- 点击Analog Input的单选按钮时,清除Rate和Link的选中状态及对应变量
尝试过.set()方法,但担心仅清除单选按钮的选中标记,并未重置关联变量,寻求解决方案。
解决方案
Tkinter中单选按钮的选中状态完全由绑定的变量控制,调用变量的.set()方法会同时更新按钮状态和变量值,你的担心是多余的。只需在每组单选按钮的回调函数中添加重置另一组变量的逻辑即可。另外,原代码中定义的Input、Rate、Link是函数局部变量,执行后会销毁,建议改为全局变量方便后续获取选中值。
修改后的完整代码:
#!/usr/bin/python3 import tkinter as tk from tkinter import * from tkinter import ttk top = tk.Tk() top.title("Informations") top.resizable(True, True) # 定义全局变量存储选中值 Input = None Rate = None Link = None # ---------------------------------------------------------------------------- Analog Input ---------------------------------------------------------------------------- # InputFrame=tk.LabelFrame(top,text="Analog Input",fg="blue") InputFrame.grid(column=0, row=0, pady = 5, sticky=tk.N) def InputCall(): global Input InputSel=InputVar.get() if InputSel == 1: Input = 1 elif InputSel == 2: Input = 2 # 重置Digital Input的变量与选中状态 RateVar.set(None) LinkVar.set(None) global Rate, Link Rate = None Link = None InputVar = tk.IntVar() radInput1 = tk.Radiobutton(InputFrame, text="1", variable = InputVar, value=1, command=InputCall) radInput1.grid(column=0, row=0, sticky=tk.W, columnspan=3) radInput2 = tk.Radiobutton(InputFrame, text="2", variable = InputVar, value=2, command=InputCall) radInput2.grid(column=0, row=1, sticky=tk.W, columnspan=3) # ---------------------------------------------------------------------------- Digital Input ---------------------------------------------------------------------------- # DigitalInputFrame = tk.LabelFrame(top, text="Digital Input", fg="blue") DigitalInputFrame.grid(column=1,row=0, padx=10, pady=5, sticky="N") RateFrame= tk.LabelFrame(DigitalInputFrame, text="Rate", fg="blue") RateFrame.grid(column=1, row=0, sticky= tk.N) def RateCall(): global Rate RateSel=RateVar.get() if RateSel == 1: Rate = 1 elif RateSel == 2: Rate = 2 # 重置Analog Input与Link的变量与选中状态 InputVar.set(None) LinkVar.set(None) global Input, Link Input = None Link = None RateVar = tk.IntVar() radRate1 = tk.Radiobutton(RateFrame, text="1", variable = RateVar, value = 1, command=RateCall) radRate1.grid(column=0, row=0, sticky=tk.W, columnspan=3) radRate2 = tk.Radiobutton(RateFrame, text="2", variable = RateVar, value = 2, command=RateCall) radRate2.grid(column=0, row=1, sticky=tk.W, columnspan=3) LinkFrame= tk.LabelFrame(DigitalInputFrame, text="Link", fg="blue") LinkFrame.grid(column=2, row=0, sticky="n") def LinkCall(): global Link LinkSel=LinkVar.get() if LinkSel == 1: Link = 1 elif LinkSel == 2: Link = 2 elif LinkSel == 3: Link = 3 elif LinkSel == 4: Link = 4 # 重置Analog Input与Rate的变量与选中状态 InputVar.set(None) RateVar.set(None) global Input, Rate Input = None Rate = None LinkVar = tk.IntVar() radLink1 = tk.Radiobutton(LinkFrame, text="Link 1", variable = LinkVar, value=1, command=LinkCall) radLink1.grid(column=1, row=0, sticky=tk.W) radLink2 = tk.Radiobutton(LinkFrame, text="Link 2", variable = LinkVar, value=2, command=LinkCall) radLink2.grid(column=1, row=1, sticky=tk.W) radLink3 = tk.Radiobutton(LinkFrame, text="Link 3", variable = LinkVar, value=3, command=LinkCall) radLink3.grid(column=3, row=0, sticky=tk.W) radLink4 = tk.Radiobutton(LinkFrame, text="Link 4", variable = LinkVar, value=4, command=LinkCall) radLink4.grid(column=3, row=1, sticky=tk.W) # Display Form top.mainloop()
关键修改说明
- 在每个回调函数中添加
变量.set(None)调用,既取消对应单选按钮的选中状态,也重置变量值 - 将
Input、Rate、Link改为全局变量,确保选中的值可在函数外部访问 - 修复原代码中Rate组第二个单选按钮变量名重复的问题
内容的提问来源于stack exchange,提问作者Cooler Mann
相关产品推荐
相关产品推荐

