动态生成的Tkinter中的复选框列表仅返回0

时间:2015-12-06 20:51:47

标签: python checkbox tkinter

我正在用python 2,7中的Tkinter写一个小gui。在某些时候,我调用一个函数来创建一个弹出窗口,该窗口由许多复选框填充,复选框的数量由属性变量定义。

def attribute_select(attributes):
popup = tk.Tk()
popup.wm_title("Attribute selection")
label = ttk.Label(popup, text="Please select which of the following \n attributes will undergo k-anonymity.",
                  font=NORMAL_FONT)
label.pack(side="top", fill="x", pady=10)

def read_status(key):
    var_obj = var.get(key)
    print "key is:", key
    print "var_obj.get() is:", var_obj.get()

def leave_mini():
    popup.destroy()

var = dict()
count = 1
for child in range(attributes):
    var[child] = tk.IntVar()
    chk = tk.Checkbutton(popup, text='Attribute: '+str(count), variable=var[child], justify="left", onvalue=1,
                          offvalue=0, command=lambda key=child: read_status(key))
    count += 1
    chk.pack()
print var
exit_button = ttk.Button(popup, text="OK", command=leave_mini)
exit_button.pack()
popup.mainloop()

一切运行得很好但是当我尝试检查其中一个框时,变量值不会每次更改打印输出:[key is:0 var_obj.get()is:0]或[key is :5 var_obj.get()是:0]。所以关键是适合每个盒子,但变量不会改变。我确定这是一个简单的解决方案我无法看到它...任何想法?

1 个答案:

答案 0 :(得分:0)

您不得创建多个Tk的实例。通过在attribute_select中创建实例,我必须假设您在其他地方创建了“真正的”根窗口。创建多个Tk实例的副作用之一是您的tkinter变量(IntVar等)的行为与您期望的不同。

如果您需要弹出窗口,请创建Toplevel的实例。