需要跟踪多个Tkinter复选框中的变量

时间:2018-02-09 14:25:45

标签: python python-2.7 tkinter

我有一个动态创建的Tkinter checkbutton小部件,它接收用户名列表的内容。然后,我在旁边显示了带有复选框的名称。

我需要做的是显然收集哪些用户名已被检查,因此我可以将其传递给另一个功能以便采取行动。

我应该如何编写此变量部分,以便创建所选用户名的新列表?

到目前为止我所拥有的:

def delprof_results(users_delprof):

    for i in range(len(users_delprof)):
        c = Checkbutton(resultsFrame, text=users_delprof[i], variable=users_delprof[i])
        c.pack(anchor=W)

    def delprof_del():
        users_chosen = []
        print str(users_delprof[i]).get() # Works up until this point. How to get individual variable with ID.

    del_but = Button(resultsFrame, text="Delete", width=7, height=1, command=delprof_del)
    del_but.pack(side=LEFT)

提前致谢, 克里斯。

2 个答案:

答案 0 :(得分:2)

如果您想要访问单个对象,只需保留对单个对象的引用,而不是创建对象,同时在循环的每次迭代中覆盖相同的变量,如:

for i in range(30):
    a = i

如何到达a的状态13?好吧,你无法覆盖

而是使用集合类型。在下面的示例中,我使用了dict

try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk


def upon_select(widget):
    print("{}'s value is {}.".format(widget['text'], widget.var.get()))


if __name__ == '__main__':
    root = tk.Tk()
    names = {"Chester", "James", "Mike"}
    username_cbs = dict()
    for name in names:
        username_cbs[name] = tk.Checkbutton(root, text=name,
                                                onvalue=True, offvalue=False)
        username_cbs[name].var = tk.BooleanVar()
        username_cbs[name]['variable'] = username_cbs[name].var
        username_cbs[name]['command'] = lambda w=username_cbs[name]: \
                                                                upon_select(w)
        username_cbs[name].pack()
    tk.mainloop()

答案 1 :(得分:1)

您可以从检查按钮中创建值列表:

values = []
for i in range(len(users_delprof)):
    v = IntVar()
    c = Checkbutton(master, text="Don't show this again", variable=v)
    c.var = v
values.append(v)

现在,您可以查看列表values,并使用v.get()获取复选按钮的值来检查值。