我希望这可以动态创建一堆复选框,并且当提交'按下按钮,查找所有选中的复选框。目前,在按“提交”时要调用select_adgroup()
,它会为每个项目打印0
,无论他们是否经过检查,除非每个复选框都被选中,在这种情况下,它会为每个项目打印1
。但我希望它只打印1
用于检查的框。
def search_adgroups(self):
self.adgroups = adgroup(checkBoxVal.get())
self.inc1 = 1
self.cbuts1 = []
for index, item in enumerate(self.adgroups):
self.adBoxVal = IntVar()
self.adgroup_check = (Checkbutton(self, variable=self.adBoxVal, text = item))
self.cbuts1.append(self.adgroup_check)
self.cbuts1[index].grid(row=self.inc1, sticky=W)
self.inc1 += 1
self.button2 = Button(self, text="Submit", command=self.select_adgroup)
self.button2.grid(row=self.inc1, sticky=W)
def select_adgroup(self):
for item in self.cbuts1:
print(self.adBoxVal.get())
答案 0 :(得分:1)
首先,它不是if all checked
,而是if last one checked
它会打印1秒。总的来说,它只打印最后一项的价值。这说明了很多问题。
在for
循环后,self.adBoxVal
的值将是最后一个,因此当您尝试使用self.adBoxVal.get()
在方法中获取其值时,您只能获得最后一个有价值的。
要解决此问题,您需要将所有self.adBoxVal
存储在列表中,然后对其进行迭代。
def search_adgroups(self):
...
...
self.chks = [] #your list for IntVars
for index, item in enumerate(self.adgroups):
adBoxVal = IntVar() #no need self here as BryanOakley points out
self.chks.append(self.adBoxVal)
#no need self at below also
adgroup_check = Checkbutton(self.root, variable=adBoxVal, text = item)
self.cbuts1.append(adgroup_check)
self.cbuts1[index].grid(row=self.inc1, sticky=W)
self.inc1 += 1
self.button2 = Button(self.root, text="Submit", command=self.select_adgroup)
self.button2.grid(row=self.inc1, sticky=W)
def select_adgroup(self):
for item in self.chks: #here you need to iterate over IntVars
#to get thier value
print (item.get())
另外,对于您将来的问题,如果您发布一个工作代码,可以在没有某些未知函数或变量的情况下重现错误,那就太好了。
编辑:让我们使用print
来说明问题。当您在print(self.addBoxVal)
下添加self.adBoxVal = IntVar()
时,您会发现每件商品都与彼此不同。
for index, item in enumerate(self.adgroups):
adBoxVal = IntVar()
print (adBoxVal)
>>>
PY_VAR0 #I assigned range(5) to adgroups that's why
PY_VAR1 #there are 5 elements here
PY_VAR2
PY_VAR3
PY_VAR4
如果您在 代码中的print (adBoxVal)
方法中添加select_adgroup
,则会看到它是PY_VARX
(最后一个),代码仅适用于/ on那。由于您使用.get()
方法获得Variable Classes'值(在您的情况下为IntVar),因此您需要不同的值。因此,您需要将每个元素保存在列表中,然后迭代它。