【问题标题】:How to get the list of text values of multiple Checkbuttons in Tkinter in Python?python - 如何在Python中获取Tkinter中多个Checkbuttons的文本值列表?
【发布时间】:2012-03-30 03:55:00
【问题描述】:

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

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',]

但是使用上面的代码,我得到了成倍的输出,而且检查按钮本身也有问题,从一开始就检查它们的状态。 任何帮助将不胜感激。

【问题讨论】:

    标签: python checkbox tkinter


    【解决方案1】:

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

    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 作为属性添加到您的检查按钮。例如:

    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 列表的需要......尽管可能有很多其他方法可以摆脱该列表)

    【讨论】:

    • 是否有任何简单的方法可以防止在更新列表中保留关闭值并且只有 ['NR'] 而不是 ['NR', '0', '0', '0', '0' ] 如果例如第一个按钮被选中?
    • 当然...最简单的方法是从列表中拉出“0”。比如你使用上面后面的chkbox_checked函数,你cn直接改成:opt=[chkbox.v.get() for chkbox in cb if chkbox.v.get != '0' ]
    • 最后一个问题:如何为 ix 中的每两项更新列值 +1?,只是我想将检查按钮放在三列中。
    • 我不完全确定我是否理解您的要求,但我会试一试...如果您希望您的复选按钮位于 3 行中,您可以执行以下操作:@ 987654326@ ...这将使行值保持 ix 的 3 个值不变,并将列值增加到 3。
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 2016-02-06
    相关资源
    最近更新 更多