代码之家  ›  专栏  ›  技术社区  ›  user888469

如何强制用户选择至少一个复选按钮

  •  2
  • user888469  · 技术社区  · 9 年前

    from tkinter import *
    
    check = Tk()
    check.title("Interests")
    CheckVar1 = IntVar()
    CheckVar2 = IntVar()
    CheckVar3 = IntVar()
    CheckVar4 = IntVar()
    CheckVar5 = IntVar()
    
    
    C1 = Checkbutton(check, text = "Horror", variable = CheckVar1, \
                     onvalue = 1, offvalue = 0, height=1, \
                     width = 20)
    C2 = Checkbutton(check, text = "Action", variable = CheckVar2, \
                     onvalue = 1, offvalue = 0, height=1, \
                     width = 20)
    C3 = Checkbutton(check, text = "Documentary", variable = CheckVar3, \
                     onvalue = 1, offvalue = 0, height=1, \
                     width = 20)
    C4 = Checkbutton(check, text = "Science fiction", variable = CheckVar4, \
                     onvalue = 1, offvalue = 0, height=1, \
                     width = 20)
    C5 = Checkbutton(check, text = "Comedy", variable = CheckVar5, \
                     onvalue = 1, offvalue = 0, height=1, \
                     width = 20)
    
    submit_btn = Button(check, text = "Submit", command = lambda: check.destroy())     
    
    
    C1.pack()
    C2.pack()
    C3.pack()
    C4.pack()
    C5.pack()
    submit_btn.pack()
    check.mainloop()
    
    if CheckVar1.get():
        #dosomething
    if CheckVar2.get():
        #dosomething
    if CheckVar3.get():
        #dosomething
    if CheckVar4.get():
        #dosomething
    if CheckVar5.get():
        #dosomething
    
    2 回复  |  直到 9 年前
        1
  •  2
  •   crazyGamer    9 年前

    在销毁窗口之前,您需要添加一个处理函数来检查是否至少选中了一个框。

    通过以下逻辑,您可以轻松做到这一点:

    from tkinter import *
    from tkinter import messagebox
    
    check = Tk()
    check.title("Interests")
    
    CheckVar1 = BooleanVar()
    CheckVar2 = BooleanVar()
    CheckVar3 = BooleanVar()
    CheckVar4 = BooleanVar()
    CheckVar5 = BooleanVar()
    
    
    C1 = Checkbutton(check, text = "Horror", variable = CheckVar1, \
                     onvalue = 1, offvalue = 0, height=1, \
                     width = 20)
    C2 = Checkbutton(check, text = "Action", variable = CheckVar2, \
                     onvalue = 1, offvalue = 0, height=1, \
                     width = 20)
    C3 = Checkbutton(check, text = "Documentary", variable = CheckVar3, \
                     onvalue = 1, offvalue = 0, height=1, \
                     width = 20)
    C4 = Checkbutton(check, text = "Science fiction", variable = CheckVar4, \
                     onvalue = 1, offvalue = 0, height=1, \
                     width = 20)
    C5 = Checkbutton(check, text = "Comedy", variable = CheckVar5, \
                     onvalue = 1, offvalue = 0, height=1, \
                     width = 20)
    
    
    def submitHandle():
        anyChecked = CheckVar1.get() | CheckVar2.get() | CheckVar3.get(
        ) | CheckVar4.get() | CheckVar5.get()
        if anyChecked:
            check.destroy()
        else:
            messagebox.showerror("Error", "Please check at least one.")
    
    
    submit_btn = Button(check, text="Submit", command=lambda: submitHandle())
    
    C1.pack()
    C2.pack()
    C3.pack()
    C4.pack()
    C5.pack()
    submit_btn.pack()
    check.mainloop()
    

    P、 请注意,您应该使用 BooleanVar 而不是 IntVar adding a check

        2
  •  0
  •   Pax Vobiscum    9 年前

    为了便于处理,您可以创建一个兴趣列表,然后使用它们循环所有内容。这也将使将来添加内容变得更容易,例如:

    from tkinter import *
    
    check = Tk()
    check.title("Interests")
    
    def destroy():
        if 1 in [vars[interest].get() for interest in interests]:
            check.destroy()
    
    interests = ["Horror", "Action", "Documentary", "Science fiction", "Comedy"]
    
    vars = {interest:IntVar() for interest in interests}
    boxes = [Checkbutton(check, text = interest, variable = vars[interest], \
                     onvalue = 1, offvalue = 0, height=1, \
                     width = 20) for interest in interests]
    
    submit_btn = Button(check, text = "Submit", command = destroy)
    
    
    tmp = [box.pack() for box in boxes]
    submit_btn.pack()