Python - Tkinter - 在列表中设置 IntVar

Python - Tkinter - setting IntVar's in a list

我编写了一个应用程序,它从用户那里获取一些数据,查询网站的 API,然后 returns 并处理 API 提供的数据。我试图通过为每个检索到的项目创建复选框来让用户更好地控制接下来发生的事情。

因为每次使用时检索到的项目数量会有所不同,所以我将复选框和 IntVars 放入列表中以判断它们是否被选中。但是,当我尝试将 IntVars 设置为 1(所以它们都开始检查)时,我得到一个 TypeError 告诉我它想要 IntVar 实例作为第一个 arg,但这对我来说没有任何意义,因为我正在尝试首先为 IntVar 调用方法。

这是我的代码的简化版本,它会生成相同的错误:

import Tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.grid()

        self.test_names = ["Box 1", "Box 2", "Box 3", "Box 4"]
        self.boxes = []
        self.box_vars = []
        self.box_num = 0

        btn_test1 = tk.Button(self, text="Test 1", width = 11, command = self.test1)
        btn_test1.grid()

    def test1(self):
        for name in self.test_names:
            self.box_vars.append(tk.IntVar)
            self.boxes.append(tk.Checkbutton(self, text = name, variable = self.box_vars[self.box_num]))
            self.box_vars[self.box_num].set(1)
            self.boxes[self.box_num].grid(sticky = tk.W)
            self.box_num += 1

root = tk.Tk()
app = Application(master=root)
app.mainloop()

以及按下按钮时的错误消息:

TypeError: unbound method set() must be called with IntVar instance as first
argument (got int instance instead)

我做错了什么?

经典问题。您添加 IntVar 类型而不是添加 IntVar 类型的对象。像这样添加括号:

self.box_vars.append(tk.IntVar())

是的,你忘记了括号。结果将是而不是 tkinter intvar 实例。