2012-08-15 88 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字典。