使用以下代码我尝试获取检查按钮的相应文本值的更新列表,每次检查或取消选中复选框:
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',]
但是使用上面的代码我会得到乘法输出,并且检查按钮本身也有问题,它们的状态从头开始检查。 任何帮助将不胜感激。
答案 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
列表的需要......尽管可能有很多其他方法可以摆脱该列表)