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
的列表中以供以后使用。
例如,当我运行此代码时,会弹出一个复选框窗口,我勾选Anne
、Bob
,然后单击OK
。selected_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
中有一个用户列表,并在根目录中使用类Checkbar
和pack
创建一个check box
。现在我们只需要获得选中的名称,所以我们创建了button
。当我们点击该按钮时,它会触发allstates
函数,我们正试图调用Checkbar.check()
函数,该函数仅返回checked button
的list
。我们这样做是通过:我们将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()