Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用单个功能更改tkinter中多个复选按钮的值_Python_Python 3.x_Tkinter - Fatal编程技术网

Python 使用单个功能更改tkinter中多个复选按钮的值

Python 使用单个功能更改tkinter中多个复选按钮的值,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我正在尝试使用tkinter为我正在工作的项目构建我的第一个GUI。我有多对相互依赖的复选按钮(在下面的示例中标记为Rule和Trace)。默认情况下,选择所有规则检查按钮,而取消选择所有跟踪检查按钮。如果我想关闭一个特定的规则检查按钮,它应该变成红色,表示它未被选中(或关闭)。如果再次单击,它将变为绿色,表示已选中(或已打开)。我已经编写了一个函数checkbutton\u state来处理这个问题。下面是我正在尝试做的工作示例。但我的问题是,此功能仅适用于规则1的“开/关”复选按钮。如何对其

我正在尝试使用tkinter为我正在工作的项目构建我的第一个GUI。我有多对相互依赖的复选按钮(在下面的示例中标记为Rule和Trace)。默认情况下,选择所有规则检查按钮,而取消选择所有跟踪检查按钮。如果我想关闭一个特定的规则检查按钮,它应该变成红色,表示它未被选中(或关闭)。如果再次单击,它将变为绿色,表示已选中(或已打开)。我已经编写了一个函数
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))