【问题标题】:Creating an array of checkboxes tied to a single list with tkinter?使用 tkinter 创建与单个列表绑定的复选框数组?
【发布时间】:2021-07-01 13:27:21
【问题描述】:

我正在尝试创建一个窗口,该窗口将提供如下所示的复选框网格:grid of checkboxes 10x10

我有以下代码来创建它:

checks = Tk()
    checks.title("Check Grid")
    value = []
    z = 1
    for x in range(1,11): # Row
        for y in range(1,11): # Column
            value.append('')
            box = Checkbutton(checks, text = z, variable = value[(z)-1])
            box.grid(row = x, column = y, sticky = S)
            z += 1
    #exit button
    def exit():
        print(value)
        checks.destroy()
    Label = Button(checks, text = 'Exit',command = exit).grid(row = 11)
    checks.mainloop()

    return value`

这样:box = Checkbutton(checks, text = z, variable = value[(x*y)-1]) 我正在尝试将复选框值分配给value 列表的 z 值。这似乎不起作用,有什么想法吗?

问题: 如何使用 tkinter 创建一个复选框网格,将它们的值发送到单个列表的列表索引?

【问题讨论】:

  • 变量必须是 tkinter 变量(通常为StringVar)。在您的情况下(value.append("")),它是一个普通的 python 字符串。将该行更改为value.append(StringVar())
  • 好吧,我做到了,但我得到了相同的结果。我什至创建了一个新列表,它遍历 value 列表并附加 value[x].get()

标签: python list tkinter checkbox


【解决方案1】:

variable 选项的目标必须是 tkinter 变量,并且您需要确保保留对这些变量的引用(即:它们不能是局部变量)

values = []
for x in range(1,11): # Row
    for y in range(1,11): # Column
        var = IntVar(value=0)
        values.append(var)
        box = Checkbutton(checks, text=z, variable=var)
        ...
...
def exit():
    data = [value.get() for value in values]
    print(data)
    checks.destroy()

【讨论】:

  • 创建IntVar时请传入master关键字参数(将master=checks添加到var = IntVar(value=0))。
  • @TheLizzard:不,在这个例子中没有必要。
  • master=checks 放入var = IntVar(value=0) 与将checks 放入box = Checkbutton(checks, ) 相同。为了保持一致性,我要么永远不会传递master 参数,要么总是传递master 参数。我们可以同意,我们不能将其排除在 Checkbutton 之外,即使它不会改变程序的外观/行为方式
  • @TheLizzard:“将 master=checks 放入 var = IntVar(value=0) 与将检查放入 box = Checkbutton(checks, )" - 实际上, 不,这不对。小部件存在于层次结构中,第一个参数建立层次结构。变量的master 参数不是建立层次结构,而是定义变量属于哪个解释器。精心设计的 tkinter 应用程序只有一个解释器,因此无需消除歧义。
  • “一个设计良好的 tkinter 应用程序只会有一个解释器” - 我不同意。 IntVar/Checkbutton/Button/... 的第一个参数是master 参数。所以你实际上可以使用var = IntVar(checks, value=0)IntVarCheckbutton 之间的唯一区别是 Checkbutton 可以显示在屏幕上(根据我对 tcl 工作原理的看法)。因此,为Checkbutton 传递第一个参数与为IntVar 传递第一个参数(master 参数)相同。
猜你喜欢
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 2012-11-23
  • 2020-06-05
相关资源
最近更新 更多