Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中从复选框获取变量_Python_Tkinter_Checkbox - Fatal编程技术网

在Python中从复选框获取变量

在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)

我尝试创建多个复选框,并获取信息,无论它们是否被选中。我试着用tkinter来达到这个目的。复选框的数量是可变的。到目前为止,我找到了一种使用以下代码创建复选框的方法。这样,就创建了10个复选框,人们可以在其中任何一个复选框上打勾

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())