![](/img/trans.png)
[英]How to get text values from multiple Tkinter CheckButtons with Python
[英]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.