2012-08-15 53 views
0

我想从迭代创建的复选框中获取Tkinter复选框值。我无法理解如何从__init__函数以外的每个/这些复选框中引用相关变量。下面是相关代码:如何从迭代创建的复选框中检索值?

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? 

回答

1

支票按钮的动态数量的创建没有(也不应该)将它们分配为实例的属性。你正在做的只是把最后一个创建为成员属性,这是非常没有意义的。

而且,你几乎有你的小部件的列表中选择正确的想法...

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 

你可以做什么,在我上面的例子中,是存储在一个字典检查按钮,假设事件名称是唯一的。这将使他们很容易按名称查找,而不是遍历列表。在这个词典中,我存储了一个元组,第一个元素是widget,第二个元素是IntVar。我不确定你是如何组织它的,但这是保存这些参考文献的一种方法。

另外,看起来你不再需要为按钮的回调传递引用做一个自定义的lambda表达式,因为select是同一个类的成员,它可以简单地看一下self.widgets字典。