如何在Python中获取Tkinter中多个Checkbuttons的文本值列表?

时间:2012-03-29 19:07:39

标签: python checkbox tkinter

使用以下代码我尝试获取检查按钮的相应文本值的更新列表,每次检查或取消选中复选框:

import Tkinter as tk

opt = []
def chkbox_checked():
    for ix, item in enumerate(cb):
        opt.append(cb_v[ix].get())
    print opt
root = tk.Tk()
mylist = [
'NR',
'ECEF X',
'ECEF Y',
'ECEF Z',
'height'
]
cb = []
cb_v = []
for ix, text in enumerate(mylist):
    cb_v.append(tk.StringVar())
    cb.append(tk.Checkbutton(root, text=text, onvalue=text, variable=cb_v[ix],   comand=chkbox_checked))
    cb[ix].grid(row=ix, column=0, sticky='w')   
label = tk.Label(root, width=20)
label.grid(row=ix+1, column=0, sticky='w')
root.mainloop()

例如,如果从第一个到最后一个检查所有按钮,我想要的输出将是:

['NR']
['NR','ECEF X]
['NR','ECEF X','ECEF Y']
['NR','ECEF X','ECEF Y','ECEF Z]
['NR','ECEF X','ECEF Y','ECEF Z','height',]

但是使用上面的代码我会得到乘法输出,并且检查按钮本身也有问题,它们的状态从头开始检查。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:5)

上面的一个问题是chkbox_checked中的opt.append ...由于每次检查/取消选中一个按钮时都会调用此函数,因此opt列表的长度将增加每次使用其中一个按钮时的检查按钮的数量。单击按钮。解决方案(下面发布)是在创建按钮时初始化opt,然后在chkbox_checked中更新它的元素。至于创建时按钮的状态,我不确定为什么它们最初被检查,但你可以使用取消选择方法在初始化时轻松取消选择按钮。

import Tkinter as tk

opt = []
def chkbox_checked():
    for ix, item in enumerate(cb):
        opt[ix]=(cb_v[ix].get())
    print opt
root = tk.Tk()  
mylist = [
'NR',
'ECEF X',
'ECEF Y',
'ECEF Z',
'height' 
]
cb = []
cb_v = []
for ix, text in enumerate(mylist):
    cb_v.append(tk.StringVar())
    off_value=0  #whatever you want it to be when the checkbutton is off
    cb.append(tk.Checkbutton(root, text=text, onvalue=text,offvalue=off_value,
                             variable=cb_v[ix],
                             command=chkbox_checked))
    cb[ix].grid(row=ix, column=0, sticky='w')
    opt.append(off_value)
    cb[-1].deselect() #uncheck the boxes initially.
label = tk.Label(root, width=20)
label.grid(row=ix+1, column=0, sticky='w')
root.mainloop()

另一个可能有用的技巧是,不必保留2个列表(cb和cb_v),只需将StringVars作为属性添加到检查按钮即可。 e.g:

v=tk.StringVar()
cb.append(tk.CheckButton(... , variable=v, ...)
cb[-1].v=v

然后你只有一个包含所有数据的列表。相应的chkbox_checked将如下所示:

def chkbox_checked():
   opt=[chkbox.v.get() for chkbox in cb]
   print opt

(注意这也消除了对全局opt列表的需要......尽管可能有很多其他方法可以摆脱该列表)