我正在尝试从迭代创建的复选框中获取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?
答案 0 :(得分: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
在上面的示例中,您可以执行的操作是将检查按钮存储在dict中,假设事件名称是唯一的。这将使它们易于按名称查找而不是循环遍历列表。在那个字典中,我存储了一个元组,第一个项目是小部件,第二个是IntVar。我不确定你是如何组织它的,但这是保存这些参考文献的一种方法。
此外,似乎您不再需要为按钮的回调执行自定义lambda来传递引用,因为select
是同一个类的成员,它可以简单地查看{{1 dict。