python - 取决于单选按钮选择的灰色复选框
问题描述
我正在尝试根据单选按钮的选择来灰显或禁用复选框。例如,如果我选择“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()
我希望当左侧的单选按钮参数被选中时,相等和相反的复选框将被禁用。相反,无论我的单选按钮选择如何,所有复选框都已启用...有人可以帮忙吗?我完全被困住了!
解决方案
您需要更改内部所需复选框的状态,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)
推荐阅读
- php - 在 LIVE 服务器上使用 Ajax Post 时出现 503 错误消息怎么办?
- racket - 如何捕获扩展的表单?
- oracle-apex - Oracle APEX - 在页面上停止主键默认值“t1000”
- c# - 如何使用反射从另一个类中获取静态字段?
- mutex - XCode 9.2 'shared_timed_mutex' 不可用:在 macOS 10.12 中引入
- android - Flutter - 解析 HTML 数据时出错
- sql - 使用新的开始和结束日期为每个值创建剧集
- mysql - MySql 更新查询不工作-通用错误
- amazon-web-services - 在不同的对等 VPC 上的私有子网和公有子网之间路由
- python - Django user.has_perm 返回 false