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

2024-09-30 04:40:15 发布

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

我试图从迭代创建的复选框中获取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?

Tags: inselfeventforinitdefargwidgets
1条回答
网友
1楼 · 发布于 2024-09-30 04:40:15

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

另外,你几乎对你的widget列表有了正确的想法。。。在

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中。这将使它们很容易按名称查找,而不是在列表中循环。在这个dict中,我存储了一个tuple,其中第一项是widget,第二项是IntVar。我不知道你到底想怎么组织它,但这是保存这些引用的一种方法。在

另外,似乎您不再需要为按钮的回调执行自定义lambda来传递引用,因为select是同一类的成员,它可以简单地查看self.widgetsdict

相关问题 更多 >

    热门问题