首页 > 解决方案 > 取决于单选按钮选择的灰色复选框

问题描述

我正在尝试根据单选按钮的选择来灰显或禁用复选框。例如,如果我选择“BRF”单选按钮,我希望禁用“BRF”复选框,但启用所有其他复选框等等......我对Tkinter很陌生,无法弄清楚为什么我的代码是不工作。

我尝试在收音机选择的条件下设置状态,但它似乎没有做任何事情。

import tkinter as tk
from tkinter import ttk 

window = tk.Tk()
window.configure(background='white')
window.geometry("500x600") # This sets the Window size to work with
window.title('Please select scan options')

button = tk.Button(window, font="Heltavica",text ="PROCEED", command=window.destroy)
button.config(bd=8, font="Ariel", justify="center")
button.pack(side=tk.BOTTOM)

comp = [('BRF','Orange'), ('SHG','Green') ,('THG','Purple'), ('ETA','Blue'), ('MAIN TEC', 'Red')]

power_scan = tk.IntVar()
check1 = tk.Checkbutton(window, text='Get power', 
        command=power_scan.get, variable = power_scan ,
        onvalue=1, offvalue=0)

check1.place(x=400,y=50)

noise_scan = tk.IntVar()
check2 = tk.Checkbutton(window, text='Get noise', 
        command=noise_scan.get(), variable = noise_scan ,
        onvalue=1, offvalue=0)

check2.place(x=400,y=100)


if power_scan.get():
    # do something
    print("Power scan selected")
if noise_scan.get():
    # do something
    print("Noise scan selected")

tk.Label(window, 
        text="""Please select a parameter scan :""",
        justify = tk.LEFT,
        padx = 20).pack()

def disable_button():
    print('disable button')
    button.config(state=tk.DISABLED)

def enable_button():
    print('enable button')
    button.config(state=tk.NORMAL)

def changebutton():
    print('changebutton=', var1.get())
    if var1.get()==1:
        enable_button()
    else:
        disable_button()     

def selected1():
    print(var1.get())


def selected2():
    print(var2.get())


var1 = tk.StringVar() #used to get the 'value' property of a tkinter.Radiobutton
var2 = tk.IntVar()

components = [("BRF", "BRF"),
              ("SHG", "SHG"),
              ("THG", "THG"),
              ("ETA", "ETA"),
              ("MAIN TEC", "MAIN TEC")
              ]


count = 0
for text, mode in components :
        a = tk.Radiobutton(window, text=text,
                        variable=var1, value=mode, command = selected1,indicatoron = 0)

        a.place(x=130,y=40+15*count*2)

        count += 1       


if selected1() == None:
    brfstate='enabled' 
    shgstate='enabled'
    thgstate ='enabled' 
    etastate='enabled'
    maintstate='enabled' 

if selected1() == "BRF":
    brfstate='disabled' 
    shgstate='enabled'
    thgstate ='enabled' 
    etastate='enabled'
    maintstate='enabled' 

elif selected1() == "SHG":
    brfstate='enabled' 
    shgstate='disabled'
    thgstate ='enabled' 
    etastate='enabled'
    maintstate='enabled' 

elif selected1() == "THG":
    brfstate='enabled' 
    shgstate='enabled'
    thgstate ='disabled' 
    etastate='enabled'
    maintstate='enabled' 

elif selected1() == "ETA":
    brfstate='enabled' 
    shgstate='enabled'
    thgstate ='enabled' 
    etastate='disabled'
    maintstate='enabled'

elif selected1() == "MAIN TEC":
    brfstate='enabled' 
    shgstate='enabled'
    thgstate ='enabled' 
    etastate='enabled'
    maintstate='disabled'


brf = ttk.Checkbutton(window, text="BRF", variable=tk.IntVar(), state=brfstate, onvalue=1, offvalue=0)
brf.place(x=300,y=40+15*0*2)

shg = ttk.Checkbutton(window, text="SHG", variable=tk.IntVar(), state=shgstate, onvalue=1, offvalue=0)
shg.place(x=300,y=40+15*1*2)        

thg = ttk.Checkbutton(window, text="THG", variable=tk.IntVar(), state=thgstate, onvalue=1, offvalue=0)
thg.place(x=300,y=40+15*2*2)

eta = ttk.Checkbutton(window, text="ETA", variable=tk.IntVar(), state=etastate, onvalue=1, offvalue=0)
eta.place(x=300,y=40+15*3*2)  

maint = ttk.Checkbutton(window, text="MAIN TEC", variable=tk.IntVar(), state=maintstate, onvalue=1, offvalue=0)
maint.place(x=300,y=40+15*4*2) 

window.mainloop()

我希望当左侧的单选按钮参数被选中时,相等和相反的复选框将被禁用。相反,无论我的单选按钮选择如何,所有复选框都已启用...有人可以帮忙吗?我完全被困住了!

标签: pythonpython-3.xcheckboxtkinterradio-button

解决方案


您需要更改内部所需复选框的状态,selected1()如下所示:

def selected1():
    selected = var1.get()
    print(selected)
    brf.config(state=tk.DISABLED if selected == "BRF" else tk.NORMAL)
    shg.config(state=tk.DISABLED if selected == "SHG" else tk.NORMAL)
    thg.config(state=tk.DISABLED if selected == "THG" else tk.NORMAL)
    eta.config(state=tk.DISABLED if selected == "ETA" else tk.NORMAL)
    maint.config(state=tk.DISABLED if selected == "MAIN TEC" else tk.NORMAL)

创建复选框之前的if/elif块不是必需的,应该删除。当然,在删除块state=...后创建复选框时,您也需要全部删除。if/elif也不需要在variable=tk.IntVar()创建复选框时使用,因为您无法引用这些IntVar. 以下是创建复选框的修改代码:

brf = ttk.Checkbutton(window, text="BRF")
brf.place(x=300, y=40+15*0*2)

shg = ttk.Checkbutton(window, text="SHG")
shg.place(x=300, y=40+15*1*2)        

thg = ttk.Checkbutton(window, text="THG")
thg.place(x=300, y=40+15*2*2)

eta = ttk.Checkbutton(window, text="ETA")
eta.place(x=300, y=40+15*3*2)  

maint = ttk.Checkbutton(window, text="MAIN TEC")
maint.place(x=300, y=40+15*4*2) 

推荐阅读