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

2024-04-25 18:01:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我想让它在运行中创建一堆复选框,当按下“提交”按钮时,查找所有复选框。目前,当按“Submit”调用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())    

Tags: 项目selfforgetindexdefitemselect
1条回答
网友
1楼 · 发布于 2024-04-25 18:01:10

首先,它不是if all checked,而是if last one checked它将打印1s,所以总体上它只打印最后一个项目的值。这说明了很多问题。在

for循环之后,self.adBoxVal的值将是最后一个值,因此当您试图用self.adBoxVal.get()在方法中获取它的值时,只能得到最后一个1的值。在

要解决这个问题,您需要将所有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来表达清楚。当你在self.adBoxVal = IntVar()下添加print(self.addBoxVal)时,你会看到每一项都是不同的。在

^{pr2}$

如果您在代码的select_adgroup方法中添加print (adBoxVal),那么您将看到它是PY_VARX(最后一个),代码只与/一起工作。由于使用.get()方法得到Variable Classes'值(在您的例子中是IntVar),因此需要不同的值。因此,您需要将每个元素保存在一个列表中,然后对其进行迭代。在

相关问题 更多 >

    热门问题