python-3.x Tkinter复选框属性出现问题,属性错误:“IntVar”对象没有属性“select”

0yycz8jy  于 2023-10-21  发布在  Python
关注(0)|答案(1)|浏览(132)

我想单击selectall复选框,并自动选中cbs列表中的所有复选框。
我得到这个错误:AttributeError: 'IntVar' object has no attribute 'select'
阅读StackOverflow,我发现了类似的问题,但使用的解决方案不起作用:selectall.configure(state=NORMAL)
我做错了什么?如何解决这个问题?谢谢你

self.selectall = tk.IntVar()
    self.Checkbutton1 = tk.IntVar()
    self.Checkbutton2 = tk.IntVar()
    self.Checkbutton3 = tk.IntVar()

    cbs = [
        self.Checkbutton1,
        self.Checkbutton2,
        self.Checkbutton3,
        ]

    def function_select_all():
        for cb in cbs:
            cb.select()

    selectall = tk.Checkbutton(self, text="Select All",
                                     variable=self.selectall,
                                     onvalue=1, offvalue=0, height=1,
                                     command= function_select_all())

#Example of Checkbox
   Checkbutton1 = tk.Checkbutton(self, text="Checkbutton1",
                  variable=self.Checkbutton1, onvalue=1, offvalue=0, height=1,   
                  command=lambda: clicked(self.Checkbutton1.get(), partial(myfunction, self)))
   Checkbutton1.place(x=-2, y=69)

更新代码(由@Bryan奥克利编辑后)

selectall_value = self.selectall.get() AttributeError: 'Checkbutton' object has no attribute 'get'.

代码

self.Checkbutton1 = tk.IntVar()
    self.Checkbutton2 = tk.IntVar()
    self.Checkbutton3 = tk.IntVar()

    def function_select_all():
        selectall_value = self.selectall.get()
        for checkbutton in self._checkbuttons:
            checkbutton_value = checkbutton.getvar(checkbutton.cget("variable"))
            if checkbutton_value != selectall_value:
                checkbutton.invoke()
    
    self._checkbuttons = [
        self.Checkbutton1,
        self.Checkbutton2,
        self.Checkbutton3,
        ]

    self.selectall = tk.IntVar()
    self.selectall = tk.Checkbutton(self, text="Select all",
                                               variable=self.selectall,
                                               onvalue=1, offvalue=0, height=1,
                                               command= function_select_all)
    self.selectall.place(x=0, y=865)

#Example of Checkbox
   Checkbutton1 = tk.Checkbutton(self, text="Checkbutton1",
                  variable=self.Checkbutton1, onvalue=1, offvalue=0, height=1,   
                  command=lambda: clicked(self.Checkbutton1.get(), partial(myfunction, self)))
   Checkbutton1.place(x=0, y=69)
snz8szmq

snz8szmq1#

错误告诉你问题的根源:你试图在一个变量上调用select(),而不是在一个checkbutton上,变量没有select方法。
由于所有的checkbutton都为选定的状态使用相同的值,因此可以调用变量的set方法来设置值:

def function_select_all():
    for cb in cbs:
        cb.set(1)

如果您更喜欢使用select方法,那么您需要覆盖复选按钮而不是变量。您需要在列表中硬编码检查按钮,或者在函数中硬编码检查按钮。

def function_select_all():
    for cb in self._checkbuttons:
        cb.select()
...
self._checkbuttons = [Checkbutton1, Checkbutton2, Checkbutton3]

如果您希望在更改checkbutton值时调用该命令,则需要调用invoke而不是select。根据规范的tcl/tk文档 “如果用户用鼠标调用checkbutton,会发生什么:切换按钮的选择状态,并调用与checkbutton关联的Tcl命令(如果有)。“

重要的是要知道invoke * 切换 * 值。因此,如果它以前被选中,它将被删除。如果你想确保它只选中了那些还没有选中的复选按钮,你需要测试一下。
在下面的示例中,当单击“Select All”按钮时,它不是切换每个复选按钮,而是切换每个复选按钮,如果它与“Select All”按钮不同。这样,选择“Select All”将选择所有,取消选择“Select All”将取消选择所有。

def function_select_all():
    selectall_value = self.selectall.get()

    for checkbutton in self._checkbuttons:
        checkbutton_value = checkbutton.getvar(checkbutton.cget("variable"))
        if checkbutton_value != selectall_value:
            checkbutton.invoke()
...
self._checkbuttons = [Checkbutton1, Checkbutton2, Checkbutton3]

然而,这不是唯一的问题。您还需要确保与“Select All”按钮关联的command是一个命令。您正在犯一个常见的错误,即调用该命令并将结果传递给command属性。相反,您需要将其设置为实际命令。
在下面的示例中,请注意值是function_select_all而不是function_select_all()

selectall = tk.Checkbutton(...,
                           command= function_select_all)

相关问题