Tkinter Checkbutton:获取多个对象的变量

时间:2015-02-17 22:23:51

标签: python python-2.7 tkinter

我希望这可以动态创建一堆复选框,并且当提交'按下按钮,查找所有选中的复选框。目前,在按“提交”时要调用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())    

1 个答案:

答案 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),因此您需要不同的值。因此,您需要将每个元素保存在列表中,然后迭代它。