在Python中从复选框获取变量
我尝试创建多个复选框,并获取信息,无论它们是否被选中。我试着用tkinter来达到这个目的。复选框的数量是可变的。到目前为止,我找到了一种使用以下代码创建复选框的方法。这样,就创建了10个复选框,人们可以在其中任何一个复选框上打勾在Python中从复选框获取变量,python,tkinter,checkbox,Python,Tkinter,Checkbox,我尝试创建多个复选框,并获取信息,无论它们是否被选中。我试着用tkinter来达到这个目的。复选框的数量是可变的。到目前为止,我找到了一种使用以下代码创建复选框的方法。这样,就创建了10个复选框,人们可以在其中任何一个复选框上打勾 class Example(tk.Frame): def __init__(self, root, *args, **kwargs): tk.Frame.__init__(self, root, *args, **kwargs)
class Example(tk.Frame):
def __init__(self, root, *args, **kwargs):
tk.Frame.__init__(self, root, *args, **kwargs)
self.root = root
self.vsb = tk.Scrollbar(self, orient="vertical")
self.text = tk.Text(self, width=40, height=20,
yscrollcommand=self.vsb.set)
self.vsb.config(command=self.text.yview)
self.vsb.pack(side="right", fill="y")
self.text.pack(side="left", fill="both", expand=True)
n=10
for i in range(n):
cb = tk.Checkbutton(self, text="Modul %s" % i)
self.text.window_create("end", window=cb)
self.text.insert("end", "\n")
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(side="top", fill="both", expand=True)
root.mainloop()
但是,信息不会保存在任何变量中。如果我在cb中添加要转储的变量,代码将选中每个复选框。编辑的代码部分如下(很抱歉,我无法突出显示添加内容):
您能否帮助我向代码中添加什么,以便用户能够获得已检查的模块?例如,如果有人勾选模块0、2和6,我将在“val”变量中得到一个带有[1,0,1,0,0,0,0,1,0,0]的列表
我期待您的反馈。您是否在寻找类似的产品
将tkinter作为tk导入
def done():
结果=[]
对于变量中的var:
result.append(变量get())
打印(结果)
root=tk.tk()
变量=[]
检查按钮=[]
对于范围(10)内的i:
var=tk.IntVar(根)
check_button=tk.Checkbutton(root,text=“Modul%i”%i,variable=var)
检查按钮包()
variables.append(var)
检查按钮。附加(检查按钮)
done\u button=tk.button(root,text=“done”,command=done)
完成按钮。包()
root.mainloop()
我在一个名为
variables
的列表中创建了10个变量,并将它们连接到每个检查按钮
您正在寻找类似的内容吗
将tkinter作为tk导入
def done():
结果=[]
对于变量中的var:
result.append(变量get())
打印(结果)
root=tk.tk()
变量=[]
检查按钮=[]
对于范围(10)内的i:
var=tk.IntVar(根)
check_button=tk.Checkbutton(root,text=“Modul%i”%i,variable=var)
检查按钮包()
variables.append(var)
检查按钮。附加(检查按钮)
done\u button=tk.button(root,text=“done”,command=done)
完成按钮。包()
root.mainloop()
我在一个名为
variables
的列表中创建了10个变量,并将它们连接到每个Checkbutton这很简单,错误在于您为所有Checkbutton创建了一个IntVar
,对于不同的按钮,您应该使用不同的IntVar
。然后我想添加的是,与其将val
作为IntVar
中的值,不如将其作为IntVar
本身,以便以后可以重用。在这里,我使用bind
打印列表,您可以创建一个按钮并向其添加command
选项
self.val = [] # self.val if you want to access it outside __init__, or just val
for i in range(n):
var1 = IntVar()
cb = tk.Checkbutton(self, text="Modul %s" % i, variable=var1)
self.text.window_create("end", window=cb)
self.text.insert("end", "\n") # to force one checkbox per line
self.val.append(var1)
self.text.bind('<Return>',lambda e:print([x.get() for x in self.val])) # Dummy function to just print a new list
这很简单,错误在于您正在为所有复选按钮创建一个IntVar
,您应该为不同的按钮创建不同的IntVar
。然后我想添加的是,与其将val
作为IntVar
中的值,不如将其作为IntVar
本身,以便以后可以重用。在这里,我使用bind
打印列表,您可以创建一个按钮并向其添加command
选项
self.val = [] # self.val if you want to access it outside __init__, or just val
for i in range(n):
var1 = IntVar()
cb = tk.Checkbutton(self, text="Modul %s" % i, variable=var1)
self.text.window_create("end", window=cb)
self.text.insert("end", "\n") # to force one checkbox per line
self.val.append(var1)
self.text.bind('<Return>',lambda e:print([x.get() for x in self.val])) # Dummy function to just print a new list
下面是另一种方法(可能其他答案更适合你,取决于你所知道的):
从tkinter导入Tk,选中按钮,IntVar
从functools导入部分
def func(n):
如果变量[n].get()==1,则打印(f'Selected{n+1}'),否则打印(f'Deselected{n+1}')
变量=[]
root=Tk()
对于范围(10)内的i:
variables.append(IntVar())
Checkbutton(root,text=f'Option{i+1}',variable=variables[i],command=partial(func,i)).pack()
root.mainloop()
(根据@CoolCloud的建议,您可以使用以下命令替换显示的命令:command=lambda i=i:func(i)
,这也应该可以工作,而且您不必导入functools)
然而,这是一个非常紧凑的设置
说明:
首先是一个空列表,其中存储所有复选框变量
然后在范围10中,即将创建10个复选框,我们执行以下操作:
首先,我们在列表中添加一个变量,该变量将被分配给每个复选按钮
然后,它创建一个Checkbutton,并通过使用索引向其添加变量,然后立即对其进行打包
关于该命令:
分部函数基本上使其参数中给出的函数始终使用该变量执行。更多信息
func()
函数:
选择时打印选项编号,否则取消选择时打印编号(添加正确的“已选择:否”和“已取消选择:否”)。它也可以写成:
如果所有_复选框[n][0].get()==1:
打印(f'Selected{n+1}')
其他:
打印(f'取消选择{n+1}')
如果您有任何问题,请向他们咨询,希望这会有所帮助
有关及其属性和参数的信息的源
下面是另一种方法(可能其他答案更适合你,取决于你所知道的):
从tkinter导入Tk,选中按钮,IntVar
从functools导入部分
def func(n):
如果变量[n].get()==1,则打印(f'Selected{n+1}'),否则打印(f'Deselected{n+1}')
变量=[]
root=Tk()
对于范围(10)内的i:
variables.append(IntVar())
Checkbutton(root,text=f'Option{i+1}',variable=variables[i],command=partial(func,i)).pack()
root.mainloop()
(根据@CoolCloud的建议,您可以使用以下命令替换显示的命令:command=lambda i=i:func(i)
,这也应该可以工作,而且您不必导入functools)
然而,这是一个非常紧凑的设置
说明:
首先是一个空列表,其中存储所有复选框变量
然后在范围10中,即将创建10个复选框,我们执行以下操作:
首先,我们在列表中添加一个变量,该变量将被分配给每个复选按钮
然后是c
temp = [] # Any empty list
for x in self.val:
temp.append(x.get())