Python 如何从迭代创建的复选框中检索值?

Python 如何从迭代创建的复选框中检索值?,python,checkbox,tkinter,Python,Checkbox,Tkinter,我试图从迭代创建的复选框中获取Tkinter复选框值。我无法理解如何从\uuuuu init\uuuu函数外部为每个/任何这些复选框引用相关变量。以下是相关代码: class Display_Window(): def __init__(self, parent): # some code excluded here self.widgets = [] for i in range(len(self.eventNameList)): # a list of

我试图从迭代创建的复选框中获取Tkinter复选框值。我无法理解如何从
\uuuuu init\uuuu
函数外部为每个/任何这些复选框引用相关变量。以下是相关代码:

class Display_Window():
    def __init__(self, parent):
# some code excluded here
        self.widgets = []
        for i in range(len(self.eventNameList)): # a list of dictionaries
            self.eventName = self.eventNameList[i]['event_name']
            self.var1 = IntVar()
            self.cbEvent = Checkbutton(self.myContainer, text=self.eventName,
                                                            variable=self.var1)
            self.cbEvent.grid(row = i+2, column = 0, sticky = W)
            self.cbEvent.deselect()
            self.widgets.append((self.eventName, self.cbEvent)

        self.bSelect = Button(self.myContainer, text="Select", width=10)
        self.bSelect.bind("<Button-1>",
                             lambda event, arg=self.widgets: self.select(arg))
        self.bSelect.bind("<Return>",
                             lambda event, arg=self.widgets: self.select(arg))
        self.bSelect.grid(row = 1, column = 2)

    def select(self, widgets):
        for widget in widgets:
            cBox = widget[1] # references the checkbox
            cBoxValue = #get() what?
class Display\u Window():
定义初始化(自身,父级):
#这里排除了一些代码
self.widgets=[]
对于范围内的i(len(self.eventNameList)):#字典列表
self.eventName=self.eventNameList[i]['event\u name']
self.var1=IntVar()
self.cbEvent=Checkbutton(self.myContainer,text=self.eventName,
变量=self.var1)
self.cbEvent.grid(行=i+2,列=0,粘性=W)
self.cbEvent.deselect()
self.widgets.append((self.eventName,self.cbEvent)
self.bSelect=按钮(self.myContainer,text=“Select”,宽度=10)
self.bSelect.bind(“,
lambda事件,arg=self.widgets:self.select(arg))
self.bSelect.bind(“,
lambda事件,arg=self.widgets:self.select(arg))
self.bSelect.grid(行=1,列=2)
def select(自我,小部件):
对于小部件中的小部件:
cBox=widget[1]#引用复选框
cBoxValue=#get()什么?

创建动态数量的检查按钮不会(也不应该)将它们指定为实例的属性。您所做的只是将最后一个创建的按钮保留为成员属性,这是毫无意义的

此外,您几乎对小部件列表有了正确的想法

class Display_Window():
    def __init__(self, parent):
...snip...

        self.widgets = {}

        for i, eventDict in enumerate(self.eventNameList):        
            eventName = eventDict['event_name']
            var1 = IntVar()
            cbEvent = Checkbutton(self.myContainer, text=eventName, variable=var1) 
            cbEvent.grid(row = i+2, column = 0, sticky = W)
            cbEvent.deselect()

            self.widgets[eventName] = (cbEvent, var1)

        self.bSelect = Button(self.myContainer, text="Select", width=10)
        self.bSelect.bind("<Button-1>", self.select)
        self.bSelect.bind("<Return>", self.select)
        self.bSelect.grid(row = 1, column = 2)

    def select(self, *args):
        for widget, intvar in self.widgets.iteritems():
            # do stuff
class Display\u Window():
定义初始化(自身,父级):
剪
self.widgets={}
对于i,枚举中的eventDict(self.eventNameList):
eventName=eventDict['event\u name']
var1=IntVar()
cbEvent=Checkbutton(self.myContainer,text=eventName,variable=var1)
cbEvent.grid(行=i+2,列=0,粘性=W)
cbEvent.deselect()
self.widgets[eventName]=(cbEvent,var1)
self.bSelect=按钮(self.myContainer,text=“Select”,宽度=10)
self.bSelect.bind(“,self.select)
self.bSelect.bind(“,self.select)
self.bSelect.grid(行=1,列=2)
def选择(自身,*参数):
对于widget,self.widgets.iteritems()中的intvar:
#做事
在我上面的例子中,您可以做的是将检查按钮存储在dict中,假设事件名称是唯一的。这将使它们易于按名称查找,而不是在列表上循环。在该dict中,我存储一个元组,其中第一项是小部件,第二项是IntVar。我不确定您是否真的希望组织它,但这是保存这些引用的一种方法

此外,您似乎不再需要为按钮的回调执行自定义lambda来传递引用,因为
select
是同一类的成员,它只需查看
self.widgets
dict即可