如何选择多个复选框,然后将值存储在列表中?python


from tkinter import *
root = Tk()    
users = ['Anne', 'Bea', 'Chris', 'Bob', 'Helen']
selected_users=[]
for x in range(len(users)):
l = Checkbutton(root, text=users[x][0], variable=users[x])
l.pack(anchor = 'w')
root.mainloop()

我有这个示例代码,我需要在users列表中进行多次选择,在我点击OK后,它会将选中的值存储到另一个名为selected_users的列表中以供以后使用。

例如,当我运行此代码时,会弹出一个复选框窗口,我勾选AnneBob,然后单击OKselected_users现在是['Anne','Bob']。窗口消失

您可以这样做:

from tkinter import *
root = Tk()    
users = ['Anne', 'Bea', 'Chris', 'Bob', 'Helen']
selected_users=[]
for x in range(len(users)):
l = Checkbutton(root, text=users[x][0], variable=users[x],command=lambda x=users[x]:selected_users.append(x))
l.pack(anchor = 'w')
Button(root,text="Ok",command=lambda: [print(selected_users),root.destroy()]).pack()
root.mainloop()

这将把值添加到列表中,当您点击Ok时,窗口将消失。

为程序添加更多功能:

from tkinter import *
root = Tk()    
users = ['Anne', 'Bea', 'Chris', 'Bob', 'Helen']
users_l=[str(i) for i in range(len(users))]
selected_users=[]
def add_remove(user,var):
if var.get()==0:
try:
selected_users.remove(user)
except KeyError:
pass
else:
selected_users.append(user)
for x in range(len(users)):
users_l[x]=IntVar(0)
l = Checkbutton(root, text=users[x], variable=users_l[x],offvalue=0,onvalue=1,command=lambda x=users[x],y=users_l[x]:add_remove(x,y))
l.pack(anchor = 'w')
Button(root,text="Ok",command=lambda: [print(selected_users),root.destroy()]).pack()
root.mainloop()

这应该适用于您:

from tkinter import *
users=['Anne', 'Bea', 'Chris', 'Bob', 'Helen']
class Checkbar(Frame):
def __init__(self, parent=None, picks=[]):
Frame.__init__(self, parent)
self.vars = []
for pick in picks:
var = IntVar()
chk = Checkbutton(self, text=pick[0], variable=var)
chk.pack()
self.vars.append(var)
def check(self):
lst=list(map((lambda var: var.get()), self.vars))
nlst=[u for l,u in zip(lst,users) if l==1]
return nlst
root = Tk()
lng = Checkbar(root, users)
lng.pack()
def allstates(): 
print(lng.check())
root.quit()
b=Button(root, text='Check', command=allstates)
b.pack()
root.mainloop()

我们在这里要做的是:
我们在users中有一个用户列表,并在根目录中使用类Checkbarpack创建一个check box。现在我们只需要获得选中的名称,所以我们创建了button。当我们点击该按钮时,它会触发allstates函数,我们正试图调用Checkbar.check()函数,该函数仅返回checked buttonlist。我们这样做是通过:我们将checkbutton变量的list命名为self.vars,使用lambda function,我们试图通过执行<Checkbutton>.get()来获得所有按钮状态,我们从中获得了类似[0,0,0,1,0]的列表,但我们不想要这样的列表,我们想要被检查的名称列表。因此,我们尝试检查anne是否已选中。如果已选中,则添加,如果未选中,则转到所有用户的下一步。

这里有一个稍微简洁一点的方法。

在检查列表中定义IntVars

一个Button,用于收集selected_users中的结果。

此版本可以重复使用。

from tkinter import *
root = Tk()    
users = [ 'Anne', 'Bea', 'Chris', 'Bob', 'Helen' ]
check = []
def select( ):
global selected_users
selected_users = []
for x, n in enumerate( check ):
selected_users.append( n.get() )
print( f'{users[ x ]} = {n.get()}' )
for x, n in enumerate( users ):
check.append( IntVar( root, value = 0 ) )
l = Checkbutton( root, text = n, variable = check[ x ] )
l.pack(anchor = 'w')
but = Button( root, text = 'Ok', command = select, width = 20 )
but.pack( fill = 'both')
root.mainloop()

最新更新