捕获 tkinter 复选框输入

capturing tkinter checkbox input

我是 运行 一个带有 tkinter 的脚本,它捕获用户输入,然后根据输入打开第二个甚至可能是第三个 window。我遇到的问题是从第三个也是最后一个 window 捕获用户输入。每个 window 在执行时被分成它自己的 python class。

下面是调用第三个 window 的代码,它可以正确执行:

test_assign = TestAssign(mylist)

这是第三个window代码:

class TestAssign:
    def __init__(self, mylist):
        self.mylist = mylist
        self.selected_values = []
        self.master = Tk()
        for i in range(len(mylist)):
             setattr(self, 'item'+mylist[i], IntVar())
             ch = Checkbutton(master, text='item'+mylist[i], variable=getattr(self, 'item'+mylist[i])
             ch.pack()
        b = Button(master, text='Next', command=self.get_selected_values)
        b.pack()

        mainloop()

    def get_selected_values(self):
        for i in range(len(self.mylist)):
            if getattr(self, 'item'+self.mylist[i]) == 1:
                self.selected_values.append(self.mylist[i])
        self.master.destroy()

Control 然后 returns 到调用点(至少我相信是这样)。我尝试打印所选值的位置:

test_assign = TestAssign(mylist)
while not test_assign.selected_values:
    pass
print test_assign.selected_values

每次执行到 print 语句时,无论是否选中复选框,它都会打印一个空列表。如果我出于测试目的调用 dir(test_assign),复选框属性就在那里。不知道为什么我不能像这样捕捉它。

谁能看出我代码中的缺陷?

两件事: 1)

ch = Checkbutton(master, text='item'+mylist[i], variable=getattr(self, 'item'+mylist[i])

b = Button(master, text='Next', command=self.get_selected_values)

我认为 master 应该是 self.master(但老实说,这几乎可以肯定只是一个 copy/pasting 错误。)

2) 重要的:

if getattr(self, 'item'+self.mylist[i]) == 1:

应该是

if getattr(self, 'item'+self.mylist[i]).get() == 1:

(您需要在 IntVar 上调用 get 才能读取该值。)