2017-08-16 70 views
2

我有一个程序,我正在努力,并希望用户选择他们的兴趣,当他们完成按提交。如果至少有一个按钮被选中,我将如何仅允许用户按提交。如何强制用户选择至少一个检查按钮

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

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

您可以通过以下逻辑做很容易:

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() 

附:请注意,您应该使用BooleanVar而不是IntVar开关复选框。另外,在窗口关闭时考虑adding a check

0

为了使这个好办,你可以创建一个利益列表,然后用它们来循环的一切。这也将使其更容易添加的东西,在未来,例如:

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() 
相关问题