Python 获取数组中的复选框状态-Tkinter

Python 获取数组中的复选框状态-Tkinter,python,tkinter,checkbox,Python,Tkinter,Checkbox,我在不到3周前刚开始编写代码(在Lynda上过一门课),现在正在开发一个GUI,它允许用户勾选/取消勾选列表。我设法把它完成了,但工作效率低下(有人给了我一个提示) 我所做的基本上是为每个复选框调用一个变量,并将复选框状态插入其中。因此,如果列表中有100个复选框,则需要创建100个变量。下面是我编写的工作代码 import tkinter as tk from tkinter import ttk root = tk.Tk() var1t1 = tk.IntVar() var2t1 = t

我在不到3周前刚开始编写代码(在Lynda上过一门课),现在正在开发一个GUI,它允许用户勾选/取消勾选列表。我设法把它完成了,但工作效率低下(有人给了我一个提示)

我所做的基本上是为每个复选框调用一个变量,并将复选框状态插入其中。因此,如果列表中有100个复选框,则需要创建100个变量。下面是我编写的工作代码

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

var1t1 = tk.IntVar()
var2t1 = tk.IntVar()
var3t1 = tk.IntVar()

var_name = []
root.title("Testing Checkbox")
root.geometry("200x150")

def boxstates_t1():
    var_name = [var1t1.get(), var2t1.get(), var3t1.get()]
    print(var_name)

# -----------------Checkbox-----------------
labelName = tk.Label(root, text = "Name")
labelName.pack(anchor = tk.W)

check1_t1 = ttk.Checkbutton(root, text = "Mike", variable = var1t1)
check1_t1.pack(anchor = tk.W)

check2_t1 = ttk.Checkbutton(root, text = "Harry", variable = var2t1)
check2_t1.pack(anchor = tk.W)

check3_t1 = ttk.Checkbutton(root, text = "Siti", variable = var3t1)
check3_t1.pack(anchor = tk.W)

# -----------------Button-----------------

btn2 = ttk.Button(root, text="Show", command = boxstates_t1)
btn2.pack(side=tk.RIGHT)

root.mainloop()
然后我搜索了一下,发现很少有代码可以让我使用for循环来打印列表。我初始化
var\u name=[]
以便它从列表中捕获每个复选框状态

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
var1 = tk.IntVar()

var_name = []
root.title("Testing Checkbox")
root.geometry("200x150")

def boxstates():
    var_name = var1.get()
    print(var_name)

# ------------------Chekbox-------------
name1 = ["Mike", "Harry", "Siti"]

labelName = tk.Label(root, text = "Name")
labelName.pack(anchor = tk.W)

for checkboxname in name1:
    check1_t1 = ttk.Checkbutton(root, text=checkboxname, variable=var1)
    check1_t1.pack(anchor = tk.W)
# ------------------Button-------------
btn2 = ttk.Button(root, text="Show", command = boxstates)
btn2.pack(side=tk.RIGHT)

root.mainloop()
但我无法单独勾选复选框,打印结果也会返回,就好像它是在单个变量中一样。我是否错误地使用数组
var\u name=[]
?我现在迷路了,不知道下一步该去哪里

任何建议都将不胜感激。

试试以下方法:

import tkinter as tk
from tkinter import ttk

def boxstates():
    finalValue = []
    for x in checkboxList:
        finalValue.append(x.get())
    print(finalValue)

root = tk.Tk()

root.title("Testing Checkbox")
root.geometry("200x150")

# ------------------Chekbox-------------

checkboxList = [tk.IntVar(), tk.IntVar(), tk.IntVar()] # if you want to add more you can either append to it or declare it before runtime
name1 = ["Mike", "Harry", "Siti"]

labelName = tk.Label(root, text = "Name")
labelName.pack(anchor = tk.W)

def createCheckboxes():
    for x, y in zip (checkboxList, name1):
        check1_t1 = ttk.Checkbutton(root, text=y, variable=x)
        check1_t1.pack(anchor = tk.W)

# ------------------Button-------------
btn2 = ttk.Button(root, text="Show", command = boxstates)
btn2.pack(side=tk.RIGHT)

createCheckboxes()
root.mainloop()
import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("Testing Checkbox")
root.geometry("200x150")

def boxstates():
    for var in vars:
        print (var.get())

names = ["Mike", "Harry", "Siti"]

labelName = tk.Label(root, text = "Name")
labelName.pack(anchor = tk.W)

vars = []

for i, checkboxname in enumerate(names):
    vars.append(tk.IntVar())
    check = ttk.Checkbutton(root, text=checkboxname, variable=vars[i])
    check.pack(anchor = tk.W)

btn = ttk.Button(root, text="Show", command = boxstates)
btn.pack(side=tk.RIGHT)

root.mainloop()

嗨,谢谢你的意见。但是从您修改的代码中,gui将所有名称打印为“Harry”,并添加所有boxstate值,而不是将它们放入数组中。我很抱歉。我误读了这个问题,现在我想我已经解决了。如果您有任何问题,您可以评论againIt works。非常感谢@Breno向我介绍zip函数。只是第25行中的一个问题,“y”变量用“checkboxList”和“name1”压缩。但是它不会打印出checkboxList,是不是因为数组中没有任何字符串?zip函数的工作原理是这样的:您可以将任意多个列表压缩在一起,对于压缩的每个列表,如果您希望在压缩时访问它,您可以为其分配一个变量。在本例中,我正在执行“for x,y In zip(checkboxList,name1):”,因此x变量包含checkboxList的所有值,y变量包含name1列表的所有值。它们按照zip函数的顺序包含列表的值-x是第一个变量,因此包含zip中第一个列表的值,即checkboxList,依此类推。。。不客气:我知道,我认为x是数组的计数器,而y是checkboxList和name1的变量。谢谢你的进一步解释。这对我很有帮助。谢谢你,成功了。请允许我问一下,在第19行中,复选框将根据枚举函数打印名称,而I作为数组的计数器?是的,计数器变量“I”覆盖“names”中的项目范围,因此它采用值0、1和2。如果选中相应的项,“get”函数将返回1,否则返回0。