在for循环中生成复选框并将响应存储在列表中

时间:2019-02-15 15:48:26

标签: python tkinter

我在尝试在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])

如果有更好的方法来完成所有这些操作,请告诉我!

1 个答案:

答案 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()
相关问题