我在尝试在for循环中生成复选框(使用tkinter
)并将响应以0s&1
s / true&false
的形式存储在列表中时遇到麻烦。
我目前有:
from tkinter import *
def createCheckButtons():
dict_keys = ('a', 'b', 'c') # ...)
numFields = len(dict_keys)
master = Tk()
cbVariables = {}
cb = {}
Label(master, text="Fields to Return").grid(row=0, sticky=W)
for x in range(numFields):
cbVariables[x] = IntVar()
cb[x] = Checkbutton(master, text=dict_keys[x], \
variable=cbVariables[x]).grid(row=(x+1)%13,column=x//13,sticky=W)
cbResponses = { }
Button(master, text='Finished Selecting',command=vars_store(cbVariables,cb,numFields,\
cbResponses)).grid(row=(x+2),sticky=W, pady=4)
mainloop() #master.mainloop()
master.update()
def vars_store(cbVariables,cab,numFields, cbResponses)
for x in range(numFields):
cbResponses[x] = cb[x].get()
createCheckButtons()
然后,我想通过执行类似以下操作,将dict_keys
简化为使用Checkbuttons选择的键:
reducedDict_Keys = { }
For x in range(len(cbResponses)):
if cbResponses[x]:
reducedDict_Keys.append(dict_keys[x])
如果有更好的方法来完成所有这些操作,请告诉我!
答案 0 :(得分:0)
您无需定义太多的dict
即可实现所需的功能-一个简单的list
即可正常工作。只需在for循环中将IntVar
附加到列表即可。您还可以使用enumerate
向可迭代对象添加计数器,在您的情况下为dict_keys
。
from tkinter import *
root = Tk()
var_store = []
dict_keys = "abcdefgh" #string is an iterable too so you don't have to use a tuple of ("a","b","c"...)
def createCheckButtons(master):
Label(master, text="Fields to Return").grid(row=0, sticky=W)
for num, x in enumerate(dict_keys):
v = IntVar()
Checkbutton(master, text=x, variable=v).grid(row=(num+1)%13,column=num//13,sticky=W)
var_store.append(v)
Button(master, text='Finished Selecting',command=vars_store).grid(sticky=W, pady=4)
def vars_store():
result = [dict_keys[num] for num, i in enumerate(var_store) if i.get()]
print (result)
createCheckButtons(root)
root.mainloop()