我想单击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)
1条答案
按热度按时间snz8szmq1#
错误告诉你问题的根源:你试图在一个变量上调用
select()
,而不是在一个checkbutton上,变量没有select
方法。由于所有的checkbutton都为选定的状态使用相同的值,因此可以调用变量的
set
方法来设置值:如果您更喜欢使用
select
方法,那么您需要覆盖复选按钮而不是变量。您需要在列表中硬编码检查按钮,或者在函数中硬编码检查按钮。如果您希望在更改checkbutton值时调用该命令,则需要调用
invoke
而不是select
。根据规范的tcl/tk文档 “如果用户用鼠标调用checkbutton,会发生什么:切换按钮的选择状态,并调用与checkbutton关联的Tcl命令(如果有)。“重要的是要知道
invoke
* 切换 * 值。因此,如果它以前被选中,它将被删除。如果你想确保它只选中了那些还没有选中的复选按钮,你需要测试一下。在下面的示例中,当单击“Select All”按钮时,它不是切换每个复选按钮,而是切换每个复选按钮,如果它与“Select All”按钮不同。这样,选择“Select All”将选择所有,取消选择“Select All”将取消选择所有。
然而,这不是唯一的问题。您还需要确保与“Select All”按钮关联的
command
是一个命令。您正在犯一个常见的错误,即调用该命令并将结果传递给command
属性。相反,您需要将其设置为实际命令。在下面的示例中,请注意值是
function_select_all
而不是function_select_all()
。