Python 使用单个功能更改tkinter中多个复选按钮的值
我正在尝试使用tkinter为我正在工作的项目构建我的第一个GUI。我有多对相互依赖的复选按钮(在下面的示例中标记为Rule和Trace)。默认情况下,选择所有规则检查按钮,而取消选择所有跟踪检查按钮。如果我想关闭一个特定的规则检查按钮,它应该变成红色,表示它未被选中(或关闭)。如果再次单击,它将变为绿色,表示已选中(或已打开)。我已经编写了一个函数Python 使用单个功能更改tkinter中多个复选按钮的值,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我正在尝试使用tkinter为我正在工作的项目构建我的第一个GUI。我有多对相互依赖的复选按钮(在下面的示例中标记为Rule和Trace)。默认情况下,选择所有规则检查按钮,而取消选择所有跟踪检查按钮。如果我想关闭一个特定的规则检查按钮,它应该变成红色,表示它未被选中(或关闭)。如果再次单击,它将变为绿色,表示已选中(或已打开)。我已经编写了一个函数checkbutton\u state来处理这个问题。下面是我正在尝试做的工作示例。但我的问题是,此功能仅适用于规则1的“开/关”复选按钮。如何对其
checkbutton\u state
来处理这个问题。下面是我正在尝试做的工作示例。但我的问题是,此功能仅适用于规则1的“开/关”复选按钮。如何对其进行概括,以便对所有规则检查按钮使用相同的函数
此外,当关闭特定规则时,其相应的跟踪检查按钮应自动关闭,并且用户不应能够将其打开。如果rule checkbutton已打开,则应关闭相应的checkbutton,但用户应能够在需要时将其打开
我尝试过使用“lambda”方法来尝试和概括函数,但没有成功。为了自动更改“跟踪”复选按钮的状态,我尝试了使用toggle()
函数,但不知怎么的,它没有给我想要的结果。我一整天都在想办法解决这个问题。如能为我提供指导,我将不胜感激
我的Python版本是3.7.1,操作系统是Windows 10(64位)
#导入所需的库/包
从tkinter导入Tk、Checkbutton、IntVar
#创建一个完整的tkinter
root=Tk()
#定义变量
规则1_on_choice=IntVar()
规则1_trace_choice=IntVar()
规则2_on_choice=IntVar()
规则2_trace_choice=IntVar()
#创建第一组检查按钮
#“跟踪”检查按钮依赖于“打开”检查按钮
#如果“打开”复选按钮已打开,“跟踪”复选按钮应关闭,但用户应能够再次打开
#如果“打开”复选按钮已关闭,“跟踪”复选按钮也应关闭,但用户应无法将其打开
rule1\u on\u checkbutton=checkbutton(root,text=“Rule 1 on”,indicatoron=0,bg=“green”,variable=rule1\u on\u choice,onvalue=1,offvalue=0,selectcolor=“green”)
rule1\u trace\u checkbutton=checkbutton(root,text=“Rule 1 trace”,indicatoron=0,bg=“red”,variable=rule1\u trace\u choice,onvalue=1,offvalue=0,selectcolor=“red”)
#创建第二组复选按钮
rule2\u on\u checkbutton=checkbutton(root,text=“Rule 2 on”,indicatoron=0,bg=“green”,variable=rule2\u on\u选项,onvalue=1,offvalue=0,selectcolor=“green”)
rule2\u trace\u checkbutton=checkbutton(root,text=“Rule 2 trace”,indicatoron=0,bg=“red”,variable=rule2\u trace\u choice,onvalue=1,offvalue=0,selectcolor=“red”)
#默认情况下,“打开”复选按钮处于打开状态
#默认情况下,“跟踪”复选按钮处于关闭状态
规则1_on_checkbutton.选择()
规则1_trace_checkbutton.取消选择()
规则2_on_checkbutton.选择()
规则2_trace_checkbutton.取消选择()
规则1_on_checkbutton.pack()
规则1_trace_checkbutton.pack()
规则2_on_checkbutton.pack()
规则2_trace_checkbutton.pack()
#用于更改checkbutton的文本和颜色的函数
#如果单击了规则检查按钮,则该按钮应变为绿色,文本显示“开”
#单击相同的复选按钮时,它现在应变为红色,文本显示“关闭”
def checkbutton_状态(事件=无):
如果规则1_on_choice.get()==1:
规则1打开检查按钮。配置(text=“规则1关闭”,bg=“红色”,fg=“灰色”)
其他:
规则1打开检查按钮。配置(text=“规则1打开”,bg=“绿色”,fg=“白色”)
#将函数绑定到规则1“打开”复选按钮
规则1关于checkbutton.bind(“,checkbutton\u状态)
root.mainloop()
如果不使用lambda
就很难完全概括函数。你可以这样做:
def checkbutton_state(event=None):
if rule1_on_choice.get() == 1:
event.widget.configure(text = event.widget['text'][0:6] + " OFF", bg = "red", fg = "grey")
else:
event.widget.configure(text = event.widget['text'][0:6] + " ON", bg = "green", fg = "white")
# Binding function to Rule 1 'on' checkbutton
rule1_on_checkbutton.bind("<Button-1>", checkbutton_state)
rule2_on_checkbutton.bind("<Button-1>", checkbutton_state)
要禁用按钮,应将状态
设置为禁用
。您可以将“跟踪”按钮作为参数传递给“规则”按钮(单击时),并相应地修改其状态
PS:我最好选择以课堂为导向的哲学,在这里你可以更自由地使用
self
阅读感谢你花时间研究我的问题。我尝试了lambda
方法,它确实有效。有没有办法配置多个小部件?我的意思是,代替事件.widget.configure
,是否可以在块中执行类似“event.widget1.configure”、“event.widget2.configure”的操作?欢迎使用。请考虑接受答案来结束这个问题。关于你的问题,绝对是的。您可以将所需的任何小部件作为lambda方法的参数传递,并在函数中使用它,类似于“rule_on_choice”。谢谢@David Duran。这正是我想要的解决方案。我已经接受了答案。我在使用lambda时犯的错误是我硬编码了选择规则1。另外,我不知道我们也可以像您在解决方案中那样传递小部件。
def checkbutton_state(event=None):
if rule1_on_choice.get() == 1:
event.widget.configure(text = event.widget['text'][0:6] + " OFF", bg = "red", fg = "grey")
else:
event.widget.configure(text = event.widget['text'][0:6] + " ON", bg = "green", fg = "white")
# Binding function to Rule 1 'on' checkbutton
rule1_on_checkbutton.bind("<Button-1>", checkbutton_state)
rule2_on_checkbutton.bind("<Button-1>", checkbutton_state)
# Using lambda
def checkbutton_state_lambda(event, rule_on_choice, text_desc):
if rule_on_choice.get() == 1:
event.widget.configure(text = text_desc + " OFF", bg = "red", fg = "grey")
else:
event.widget.configure(text = text_desc + " ON", bg = "green", fg = "white")
# Binding function to Rule 1 'on' checkbutton
rule1_on_checkbutton.bind("<Button-1>", lambda event, a=rule1_on_choice, b="Rule 1": checkbutton_state_lambda(event, a, b))
rule2_on_checkbutton.bind("<Button-1>", lambda event, a=rule2_on_choice, b="Rule 2": checkbutton_state_lambda(event, a, b))