Python Can';t使用命令-Tkinter更改其他Ttk检查按钮的状态

Python Can';t使用命令-Tkinter更改其他Ttk检查按钮的状态,python,tkinter,ttk,Python,Tkinter,Ttk,当单击任何其他CheckButton时,如何使一个CheckButton被禁用和选中 我想禁用并在点击chk2时将chk1设置为选中,如果未选中,我想将chk1的状态设置为正常 我在下面使用时出错- 将tkinter作为tk导入 从tkinter导入ttk 类根(tk.tk): 定义初始化(自): super()。\uuuu init\uuuuu() var1=tk.IntVar() chk1=ttk.Checkbutton(self,text='Class',var1) #chk1.state

当单击任何其他CheckButton时,如何使一个CheckButton被禁用和选中

我想禁用并在点击
chk2
时将
chk1
设置为选中,如果未选中,我想将
chk1
的状态设置为正常

我在下面使用时出错-

将tkinter作为tk导入
从tkinter导入ttk
类根(tk.tk):
定义初始化(自):
super()。\uuuu init\uuuuu()
var1=tk.IntVar()
chk1=ttk.Checkbutton(self,text='Class',var1)
#chk1.state(['selected']))
chk1.pack(侧面=‘左侧’)
var2=tk.IntVar()
chk2=ttk.Checkbutton(self,text='Section',variable=var2,
command=lambda:self.chk(chk1,var2))
#chk2.state(['selected']))
chk2.pack(侧边=‘左’)
def chk(自身、obj、自身):
如果self_val.get()==1:#从0更改为1
对象状态['selected']
obj.configure(状态='disabled')
其他:
obj.configure(状态='normal')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
Root().mainloop()
Tkinter回调中出现异常 回溯(最近一次呼叫最后一次): 文件“C:\Users\Sagar\Anaconda3\lib\tkinter\\ uuuuu init\uuuuu.py”,第1705行,在调用中__ 返回self.func(*args) 文件“d:\chkbtn.py”,第18行,在 command=lambda:self.chk(chk1,var2)) 文件“d:\chkbtn.py”,第24行,在chk中 对象状态['selected'] TypeError:“方法”对象不可下标
我认为在混乱之后,您需要在lambda和方法中添加第三个变量

以设置状态并更新变量

请尝试以下选项,如果有帮助,请告诉我:

import tkinter as tk
from tkinter import ttk


class Root(tk.Tk):
    def __init__(self):
        super().__init__()
        var1 = tk.IntVar(self)
        var2 = tk.IntVar(self)
        chk1 = ttk.Checkbutton(self, text='chk1', variable=var1)
        chk2 = ttk.Checkbutton(self, text='chk2', variable=var2, command=lambda: self.chk(var1, chk1, var2))
        chk1.pack(side='left')
        chk2.pack(side='left')

    def chk(self, var1, chk1, chk2):
        if chk2.get() == 1:
            var1.set(1) # need to set the value of var1 to update chk1
            chk1.configure(state='disabled')
        else:
            var1.set(0)
            chk1.configure(state='normal')


if __name__ == '__main__':
    Root().mainloop()
下面是一个使用类属性而不是lambda的示例

import tkinter as tk
from tkinter import ttk


class Root(tk.Tk):
    def __init__(self):
        super().__init__()
        self.var1 = tk.IntVar(self)
        self.var2 = tk.IntVar(self)
        self.chk1 = ttk.Checkbutton(self, text='chk1', variable=self.var1)
        chk2 = ttk.Checkbutton(self, text='chk2', variable=self.var2, command=self.chk)
        self.chk1.pack(side='left')
        chk2.pack(side='left')

    def chk(self):
        if self.var2.get() == 1:
            self.var1.set(1)  # need to set the value of var1 to update chk1
            self.chk1.configure(state='disabled')
        else:
            self.var1.set(0)
            self.chk1.configure(state='normal')


if __name__ == '__main__':
    Root().mainloop()

既然可以使用class属性,为什么还要使用lambda来传递变量?在您的方法中将
obj.state['selected']
更改为
obj.state(['selected'])
。嗯,我第一次是对的,但在定义函数时无意中键入了没有大括号的state,但问题尚未解决,它没有按我的预期工作。如果我不使用lambda,那么chk1总是被禁用的。不知道为什么?好吧,通过将if语句中的值从0更改为1,问题在某种程度上得到了解决,但是,当禁用chk1并单击chk2时,chk1将按预期禁用,但未显示为选中状态,原因是什么?您的错误解决了吗?代码通过修复我提到的一件事,在我这方面工作正常。看看我上面关于我现在遇到的问题的评论。现在工作很好,但是为什么
obj.set(['selected'])
没有工作呢?你也说过不要使用lambda,但是如果程序不能正常工作,为什么呢?@Sagar我说过你可以使用class属性。目前你的变量没有设置为属性。哦,这是有道理的。感谢您的帮助和时间。@Sagar回答您关于
obj.set()
Tkinters的问题时,CheckButton没有一个
set()
,如果您的意思是
obj.state(['selected'])
,那么这可能是因为状态只能设置为3个选项<代码>正常,
禁用
激活
。我猜它只是忽略了命令。虽然我认为这会带来一个错误。