【问题标题】:Get Checkbox states in array - Tkinter获取数组中的复选框状态 - Tkinter
【发布时间】:2019-12-23 21:49:51
【问题描述】:

我在不到 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_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_name = []了吗?我现在迷路了,不知道下一步该去哪里。

非常感谢任何建议。

【问题讨论】:

    标签: python tkinter checkbox


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 谢谢,它成功了。请问,在第19行,checkbox会根据enumerate函数打印出名字,而i作为数组的计数器?
    • 是的,计数器变量“i”涵盖了“names”中的项目范围,因此它的值是 0、1 和 2。我猜如果相应的项目,“get”函数会返回 1被选中,否则为 0。
    【解决方案2】:
    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()
    

    【讨论】:

    • 您好,感谢您的意见。但是从您修改后的代码中,gui 将所有名称打印为“Harry”并添加所有 boxstate 值而不是将它们放入数组中。
    • 对不起。我误读了这个问题,现在我想我已经解决了。有问题可以再评论
    • 它有效。非常感谢@Breno 向我介绍了 zip 功能。只是第 25 行中的一个问题,'y' 变量与'checkboxList' 和'name1' 一起压缩。但是没有打印出checkboxList,是不是因为数组里面没有字符串?
    • zip 函数的工作方式如下:您可以将任意数量的列表压缩在一起,并且对于您压缩的每个列表,如果您想在压缩时访问它,您可以为其分配一个变量。在这种情况下,我正在执行“for x, y in zip (checkboxList, name1):”,因此 x 变量包含 checkboxList 的所有值,y 变量包含 name1 列表的所有值。它们包含按 zip 函数顺序排列的列表的值 - x 是第一个变量,因此包含 zip 中第一个列表的值,即 checkboxList 等等……不客气:D
    • 我明白了,我认为 x 作为数组的计数器,而 y 是 checkboxList 和 name1 的变量。感谢您的进一步解释。这对我帮助很大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2014-05-12
    • 2012-10-25
    相关资源
    最近更新 更多