簡體   English   中英

如何在Python的Tkinter中獲取多個Checkbutton的文本值列表?

[英]How to get the list of text values of multiple Checkbuttons in Tkinter in Python?

使用以下代碼,每當選中或取消選中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',]

但是通過上面的代碼,我得到了成倍的輸出,並且checkbutton本身也出了問題,它們的狀態從一開始就被檢查了。 任何幫助,將不勝感激。

上面的一個問題是chkbox_checked中的opt.append ... ...由於每次選中/取消選中按鈕時都會調用此函數,因此,每次單擊其中一個按鈕時,opt列表的長度將增加您擁有的checkbutton的數量。 。 解決方案(在下面發布)是在創建按鈕時初始化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列表的需求……盡管可能還有很多其他方法可以擺脫該列表)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM