捕获 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
才能读取该值。)
我是 运行 一个带有 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
才能读取该值。)