python tkinter复选框集并行运行

python tkinter复选框集并行运行,python,tkinter,Python,Tkinter,我定义了两组复选框,它们都输出到一个单独的列表中。代码运行时,会正确打开一个带有两个复选框的窗口。然而,当我签入一组时,它也会签入另一组。有什么想法吗 from Tkinter import * root = Tk() n2_hit = range (4) n1_hit = range (4) self = Frame() self.underframe = Frame() self.underframe.n2e = Frame(self.underframe, bd = 2, rel

我定义了两组复选框,它们都输出到一个单独的列表中。代码运行时,会正确打开一个带有两个复选框的窗口。然而,当我签入一组时,它也会签入另一组。有什么想法吗

from Tkinter import *
root = Tk()

n2_hit = range (4)
n1_hit = range (4)

self = Frame()

self.underframe = Frame()

self.underframe.n2e  = Frame(self.underframe, bd = 2, relief = RIDGE)
c_n2_0 = Checkbutton (self.underframe.n2e, variable = n2_hit[0])
c_n2_0.pack (side=LEFT)
c_n2_1 = Checkbutton (self.underframe.n2e, variable = n2_hit[1])
c_n2_1.pack (side=LEFT)
c_n2_2 = Checkbutton (self.underframe.n2e, variable = n2_hit[2])
c_n2_2.pack (side=LEFT)
c_n2_3 = Checkbutton (self.underframe.n2e, variable = n2_hit[3])
c_n2_3.pack (side=LEFT)
self.underframe.n2e.pack (side=LEFT)

self.underframe.n1e  = Frame(self.underframe, bd = 2, relief = RIDGE)
c_n1_0 = Checkbutton (self.underframe.n1e, variable = n1_hit[0])
c_n1_0.pack (side=LEFT)
c_n1_1 = Checkbutton (self.underframe.n1e, variable = n1_hit[1])
c_n1_1.pack (side=LEFT)
c_n1_2 = Checkbutton (self.underframe.n1e, variable = n1_hit[2])
c_n1_2.pack (side=LEFT)
c_n1_3 = Checkbutton (self.underframe.n1e, variable = n1_hit[3])
c_n1_3.pack (side=LEFT)
self.underframe.n1e.pack (side=LEFT)

self.underframe.pack (side=TOP)

self.pack ()

我认为您应该阅读更多关于tkiner的内容,并且我认为您应该使用另一种编程范式,例如:面向对象编程(OOP)

在这里,我放置了一个具有您想要的功能的代码:

    from tkinter import *
    class Checkbar(Frame):
       def __init__(self, parent=None, picks=[], side=LEFT, anchor=W):
          Frame.__init__(self, parent)
          self.vars = []
          for pick in picks:
             var = IntVar()
             chk = Checkbutton(self, text=pick, variable=var)
             chk.pack(side=side, anchor=anchor, expand=YES)
             self.vars.append(var)
       def state(self):
          return map((lambda var: var.get()), self.vars)



  if __name__ == '__main__':
           root = Tk()
           lng = Checkbar(root, ['op1', 'op2','op3' ])
           tgl = Checkbar(root, ['op_1','op_2'])
           lng.pack(side=TOP,  fill=X)
           tgl.pack(side=LEFT)
           lng.config(relief=GROOVE, bd=2)

           def allstates(): 
              print(list(lng.state()), list(tgl.state()))
           Button(root, text='Quit', command=root.quit).pack(side=RIGHT)
           Button(root, text='What are select??', command=allstates).pack(side=RIGHT)
           root.mainloop()

检查按钮的
变量
属性需要设置为一个特殊的tkinter变量
StringVar
IntVar
BooleanVar
DoubleVar
。您的代码正在将它们设置为整数。您需要为每个复选按钮创建其中一个变量。

之所以会发生这种情况,是因为
n1\u hit[0]
n2\u hit[0]
都指向同一事物(即使它们在不同的列表中)。解决这一问题的方法将根据您在未来的努力目标而有所不同。Checkbutton的
变量
参数的预期用途是
IntVar()
,因此您可能需要考虑将这些变量添加到列表中,然后使用
onvalue=
offvalue=
设置它们