Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中获取Tkinter中多个复选按钮的文本值列表?_Python_Checkbox_Tkinter - Fatal编程技术网

如何在Python中获取Tkinter中多个复选按钮的文本值列表?

如何在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

每次选中或取消选中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',
'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。