出于某种原因,单击一个复选框会激活所有复选框

Clicking on one checkbox activates all of them for some reason

我在 Python 中开发 UI 的经验很少,现在使用 tkinter 我 运行 遇到了一个问题许多复选框,它们都分配给不同的变量,但出于某种原因,单击其中一个复选框会激活所有这些复选框。

所以在 __init__ 我声明了应该响应点击复选框的变量:

class ImputerGUI:

    def __init__(self):

        self.mineralogy: int = 0
        self.porosity: int = 0
        self.water_table: int = 0
        self.hem = self.goe = self.vgoe = self.ogoe = self.kao = self.asmc = self.fsmc = \
            self.wmic = self.gibs = self.carb = self.qtz = self.pyr = self.sid = 0


        self.root = tk.Tk()
        self._create_interface()

        self.root.mainloop()

然后我创建框架和两组复选框 - 三个复选框应该转到 mid_left 框架,其余的 - 进入 mid_right:

    def _create_interface(self):
        self.root.geometry("800x700")
        self._create_frames()
        self._create_major_component_checkboxes()
        self._create_mineral_checkbuttons()

    def _create_frames(self):
        self.top = tk.Frame(self.root)
        self.mid_left = tk.Frame(self.root, borderwidth=1, relief='sunken')
        self.mid_right = tk.Frame(self.root, borderwidth=1, relief='sunken')
        self.bottom = tk.Frame(self.root)

        self.top.grid(row=0, columnspan=5)
        self.mid_left.grid(row=2, column=0, pady=40)
        self.mid_right.grid(row=2, column=3, pady=40)
        self.bottom.grid(row=3, pady=80, columnspan=5)

    def _create_major_component_checkboxes(self):
        miner_check = tk.Checkbutton(self.mid_left, text='Populate mineralogy variables',
                                     variable=self.mineralogy, justify=tk.LEFT,
                                     onvalue=1, offvalue=0)
        porosity_check = tk.Checkbutton(self.mid_left, text='Populate porosity data',
                                        variable=self.porosity, justify=tk.LEFT,
                                        onvalue=1, offvalue=0)
        wtb_check = tk.Checkbutton(self.mid_left, text='Populate distance from water table',
                                   variable=self.water_table, justify=tk.LEFT,
                                   onvalue=1, offvalue=0)

        miner_check.grid(row=1, column=0)
        porosity_check.grid(row=2, column=0)
        wtb_check.grid(row=3, column=0)

    def _create_mineral_checkbuttons(self):
        miner_dict = {'HEM_R': ['hematite', self.hem],
                      'GOE_R': ['goethite', self.goe],
                      'VGOE_R': ['vitreous_goethite', self.vgoe],
                      'OGOE_R': ['ochreous_goethite', self.ogoe],
                      'KAO_R': ['kaolinite', self.kao],
                      'ASMC_R': ['asmectite', self.asmc],
                      'FSMC_R': ['fsmectite', self.fsmc],
                      'WMIC_R': ['white_mica', self.wmic],
                      'GIBS_R': ['gibbsite', self.gibs],
                      'CARB_R': ['carbonate', self.carb],
                      'QTZ_R': ['quartz', self.qtz],
                      'SID_R': ['siderite', self.sid],
                      'PYR_R': ['pyrite', self.pyr]}

        for key, value, idx in zip(miner_dict.keys(), miner_dict.values(), enumerate(miner_dict)):
            temp = tk.Checkbutton(self.mid_right, text=value[0].replace('_', ' '), variable=value[1],
                               onvalue=1, offvalue=0, state=tk.DISABLED, justify=tk.LEFT)
            temp.grid(row=idx[0], column=4)
            miner_dict[key].append(temp)

现在所有复选框(以及其他 UI 为简洁起见我没有包括的元素)都按预期创建,但现在由于某种原因,当我单击其中一个复选框时,所有这些都被激活.这包括默认情况下全部禁用的整个第二组。

有人知道我做错了什么吗?

您需要将您的复选框“变量”(self.minerology 等)初始化为 tk.IntVar 或者,可能更适合您的情况,tk.BooleanVar 对象,而不是普通的 Python 整数,例如 0.