如何在Python中获取Tkinter中多个复选按钮的文本值列表?
每次选中或取消选中checkbutton时,我都会使用以下代码尝试获取checkbutton对应文本值的更新列表:如何在Python中获取Tkinter中多个复选按钮的文本值列表?,python,checkbox,tkinter,Python,Checkbox,Tkinter,每次选中或取消选中checkbutton时,我都会使用以下代码尝试获取checkbutton对应文本值的更新列表: 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', 'EC
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',]
但在上面的代码中,我得到了成倍的输出,而且复选按钮本身也有问题,它们的状态从一开始就被检查。
如有任何帮助,我们将不胜感激。上述问题之一是chkbox\u中的opt.append被选中。。。由于每次选中/取消选中按钮时都会调用此函数,因此每次单击其中一个按钮时,选项列表的长度将增加选中按钮的数量。解决方案(如下所示)是在创建按钮时初始化opt,然后在chkbox\u 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()
另一个可能有用的技巧是,不用保留两个列表(cb和cb_v),只需将StringVars作为属性添加到复选按钮中即可。e、 g:
v=tk.StringVar()
cb.append(tk.CheckButton(... , variable=v, ...)
cb[-1].v=v
然后你就有了一个包含所有数据的列表。选中的相应chkbox_如下所示:
def chkbox_checked():
opt=[chkbox.v.get() for chkbox in cb]
print opt
(请注意,这也消除了对全局
opt
列表的需要…尽管可能有很多其他方法可以去除该列表)是否有任何简单的方法可以防止在更新的列表中保留值,并且如果选中第一个按钮,则只有['NR']而不是['NR',0',0',0',0']。。。最简单的方法是从列表中拉出“0”。例如,如果使用上面的后一个chkbox_checked函数,只需将其更改为:opt=[chkbox.v.get(),用于cb中的chkbox,如果chkbox.v.get!=“0”]
最后一个问题:如何为ix中的每两项更新列值+1?,简单地说,我想把复选框放在三列中。我不完全确定我是否理解你的要求,但我会尝试一下。。。如果您想将复选按钮分为3行,可以执行如下操作:cb[ix].grid(row=int(ix/3),column=ix%3)
。。。这将使ix的3个值的行值保持不变,并将列值增加到3。