Python 为什么默认选中我的Checkbutton?

Python 为什么默认选中我的Checkbutton?,python,tkinter,Python,Tkinter,我有一个函数,它接收一个列表,并为列表中的每个元素创建一个检查按钮。这是一种菜单。但是当我调用此函数时,每个Checkbutton都已被选中,如何修复它 def ask_event(args): root = tk.Tk() eventToReturn = tk.StringVar(root) for i,arg in enumerate(args): tk.Checkbutton(root, text = arg, onvalue = arg, vari

我有一个函数,它接收一个列表,并为列表中的每个元素创建一个
检查按钮。这是一种菜单。但是当我调用此函数时,每个
Checkbutton
都已被选中,如何修复它

def ask_event(args):
    root = tk.Tk()
    eventToReturn = tk.StringVar(root)
    for i,arg in enumerate(args):
        tk.Checkbutton(root, text = arg, onvalue = arg, variable = eventToReturn).grid(row = i, column = 1)
    tk.Button(root, text = "Confirm", command = root.quit).grid()

    root.mainloop()
    root.destroy()
    value = eventToReturn.get()

    return value

tkinter checkbutton有3种状态:

  • 检查
  • 未经检查
  • “半检查”状态,称为“三态模式”。当您在一个层次结构中排列了多个复选按钮时,此状态非常有用-当选中一些“子”复选按钮时,“父”复选按钮应处于此第三种状态
  • 默认情况下,这3个状态对应这3个值:

    • 选中=1
    • 未选中=0
    • 变灰了=还有别的吗
    (可以使用
    onvalue
    offvalue
    参数更改这些值,请参阅。)


    这解释了为什么checkbutton在默认情况下显示为选中状态:新的
    StringVar
    的值是空字符串,对应于特殊的第三种状态

    要将checkbutton的状态设置为“unchecked”,必须将变量设置为
    offvalue
    (默认值为0):

    或者,您可以使用默认设置为0的
    BooleanVar
    IntVar

    eventToReturn = tk.IntVar()
    

    “StringVar无法正确保存checkbutton的状态”-这是错误的陈述。使用带有复选按钮的
    StringVar
    是完全可以接受的。当状态为开或关(或第三个三态值)时,值本身可以是任意字符串。@BryanOakley你说得对,但我找不到有关第三个状态的任何信息。checkbutton显示为灰色并已选中,但这种状态实际上意味着什么?你愿意写一个答案吗?当你有一个层次结构的复选按钮时,第三种状态最有用。如果您有一组checkbutton,其中一些选中,一些未选中,则它们的父checkbutton将具有第三个值。规范的tcl/tk文档在这里进行了描述:@BryanOakley感谢您提供的信息,我已经更正了我的答案。三态检查按钮不一定是灰色的。这取决于您运行的平台。此外,要将checkbuttons状态设置为“unchecked”,必须将其设置为offvalue,offvalue可能为零,也可能不为零。这里有一个不同平台上第三种状态的屏幕截图:请添加。
    eventToReturn = tk.IntVar()