我正在撰寫一個具有多個動態復選框的代碼,我的要求是
要保留復選框的選擇,在我當前的代碼中,如果我選擇另一個復選框,則會自動取消選擇第一個選擇。簡而言之,我無法保持選中多個復選框

在使用選中的復選框時獲取值并添加到串列中,并在用戶取消選中復選框時洗掉相同的值。目前發生的情況是,當我選擇復選框時,它在串列中添加了正確的值,但是當我取消選擇相同的復選框時,而不是洗掉該值,0 被附加到串列中。

下面是我正在嘗試的代碼片段。這里 eqpt_dict 是一個字典,所以當用戶選擇復選框時,我想在串列中添加該鍵的值,當用戶取消選擇復選框時,我想從串列中洗掉相同的值。
eqpt_dict = {'MDDDSERFEP1A': '10.5.30.110', 'MDDDSERFEP1B': 'x.x.x.x', 'MDDDSERFEP2A': 'x.x.x.x', 'MDDDSERFEP2B': 'x.x.x.x', 'TE02MSERFEPA': 'x.x.x.x', 'TE02MSERFEPB': 'x.x.x.x', 'TE03MSERFEPA': 'x.x.x.x', 'TE03MSERFEPB': 'x.x.x.x', 'TE05MSERFEPA': 'x.x.x.x', 'TE05MSERFEPB': 'x.x.x.x', 'TE06MSERFEPA': 'x.x.x.x', 'TE06MSERFEPB': 'x.x.x.x', 'TE09MSERFEPA': 'x.x.x.x', 'TE09MSERFEPB': 'x.x.x.x', 'TE10MSERFEPA': 'x.x.x.x', 'TE10MSERFEPB': 'x.x.x.x', 'TE14MSERFEPA': 'x.x.x.x', 'TE14MSERFEPB': 'x.x.x.x', 'TE17MSERFEPA': 'x.x.x.x', 'TE17MSERFEPB': 'x.x.x.x', 'TE19MSERFEPA': 'x.x.x.x', 'TE19MSERFEPB': 'x.x.x.x', 'TE22MSERFEPA': 'x.x.x.x', 'TE22MSERFEPB': 'x.x.x.x', 'selfServer': 'x.x.x.x'}
ip_list = list()
def checkbox_command():
if var.get():
if var.get() not in ip_list:
ip_list.append(var.get())
if not var.get():
ip_list.remove(var.get())
print(ip_list)
var = StringVar()
var.set('0')
for eqpt,ip in eqpt_dict.items():
checkbutton4 = Checkbutton(text4, text=eqpt, variable=var, onvalue=ip,offvalue=0,bg='white', cursor="hand2",command=checkbox_command)
checkbutton4.pack()
uj5u.com熱心網友回復:
每個檢查按鈕都需要自己的單獨變數。當你這樣做時variable=var,你為每個檢查按鈕分配了相同的變數,這意味著所有檢查按鈕都將具有相同的值。
uj5u.com熱心網友回復:
除了 Bryan Oakley 的回答之外, 中的邏輯也存在問題checkbox_command。 var.get()回傳字串 '0' 而不是整數 0。這是 Truthy 并解釋了為什么取消選中一個框會在ip_list.
下面是帶有vars字典的代碼,該字典包含按鈕的勾選/未勾選狀態。然后checkbox_command讀取所有按鈕的狀態以創建最新版本ip_list
這是解決該問題的許多可能方法之一。
import tkinter as tk # import as tk is safer and more flexible
root = tk.Tk()
eqpt_dict = {'MDDDSERFEP1A': '10.5.30.110', 'MDDDSERFEP1B': 'x.x.x.x',
'MDDDSERFEP2A': 'x.x.x.x', 'MDDDSERFEP2B': 'x.x.x.x',
'TE02MSERFEPA': 'x.x.x.x', 'TE02MSERFEPB': 'x.x.x.x',
'TE03MSERFEPA': 'x.x.x.x', 'TE03MSERFEPB': 'x.x.x.x',
}
ip_list = list() # result list
def checkbox_command():
""" Iterate through the vars dictionary and get the addresses from the
dictionary when the checkbox is set.
"""
global ip_list
# ip_list = [ eqpt_dict[ key] for key in eqpt_dict.keys() if vars[key].get() == 1 ]
# List comprehension if you prefer.
ip_list = []
for key in eqpt_dict.keys():
if vars[ key ].get() == 1:
ip_list.append( eqpt_dict[ key ] )
print( ip_list )
vars = {} # A dict of vars. Each checkbox needs it's own StringVar
# The dictionary keeps the state of each Checkbox
for eqpt in eqpt_dict.keys():
vars[ eqpt ] = tk.IntVar( value = 0 )
checkbutton4 = tk.Checkbutton( root, text = eqpt, variable = vars[ eqpt ],
onvalue = 1, offvalue = 0, bg = 'white', cursor = "hand2",
command = checkbox_command )
checkbutton4.pack()
root.mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/492992.html
上一篇:Tkinter按鈕小部件
下一篇:生成所有可用等寬字體的串列
