2016-09-21 73 views
0

所以我有一個表單,要求用戶輸入所有信息。只有輸入所有信息才能保存信息。然而,一個奇怪的小錯誤已經出現。提交後沒有選擇複選框,然後切換到yes(是的,這是有意的),只要選擇一個單選按鈕,數據就會被保存。我不希望更改表單的屬性,我只希望在if語句中檢查時修復語義錯誤。程序中if語句檢查期間的語義錯誤

#Import tkinter to make gui 
from tkinter import * 
from tkinter import ttk 
from tkinter import messagebox 

#Sets title and creates gui 
root = Tk() 
root.title("Entry Form") 

def changed1(*args): 
    if yes.get()=="1": 
     no.set('0') 
def changed2(*args): 
    if no.get()=="1": 
     yes.set('0') 

#After sumbitting with no selected and then switching to yes afterwards as long as a radiobutton is seletected, data is saved? 
def submit(*args): #Realign? 
    file = open("data.csv", "a") 
    if first.get() != "" and last.get() != "" and option.get() == 'Business' or option.get() == 'Residence' or option.get() == 'Other' and state.get() != "" and yes.get() == '1' or no.get() == '1': 
     if yes.get()=='1': 
      file.write(last.get().title() + "," + first.get().title() + "," + option.get() + "," + state.get() + '\n') 
      printer.set("Data Saved!") 
     else: 
      messagebox.showinfo("Unauthorized", "You must accept terms to continue.") 
    else: 
     messagebox.showinfo("Incomplete Information", "Please fill out all parts of the form") 

#Configures column and row settings and sets padding 
mainframe = ttk.Frame(root, padding="3 3 12 12") 
mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) 
mainframe.columnconfigure(0, weight=1) 
mainframe.rowconfigure(0, weight=1) 

first = StringVar() 
last = StringVar() 
option = StringVar() 
statevar = StringVar() 
printer = StringVar() 
yes = StringVar() 
no = StringVar() 

#Widgets to put in name 
firstvar = ttk.Entry(mainframe, width=15, textvariable=first) 
firstvar.grid(column=2, row=1, sticky=(N, W)) 

lastvar = ttk.Entry(mainframe, width=15, textvariable=last) 
lastvar.grid(column=2, row=2, sticky=(N, W)) 

ttk.Label(mainframe, text="First Name").grid(column=1, row=1, sticky=(W)) 
ttk.Label(mainframe, text="Last Name").grid(column=1, row=2, sticky=(W)) 

business = ttk.Radiobutton(mainframe, text='Business', variable=option, value='Business') 
residence = ttk.Radiobutton(mainframe, text='Residence', variable=option, value='Residence') 
other = ttk.Radiobutton(mainframe, text='Other', variable=option, value='Other') 

business.grid(column=1, row=3, sticky=(W, E)) 
residence.grid(column=2, row=3, sticky=(W, E)) 
other.grid(column=3, row=3, sticky=(W, E)) 

state = ttk.Combobox(mainframe, textvariable=statevar, state='readonly') 
state.grid(column=2, row=4, sticky=(W)) 

ttk.Label(mainframe, text="State").grid(column=1, row=4, sticky=W) 
state['values'] = ('Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 'Delaware', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachussetts', 'Michigan', 'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvannia', 'Rhode Island', 'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming') 

#Creates no checkbutton 
yesvar = ttk.Checkbutton(mainframe, text='Yes', command=changed1, variable=yes) 
yesvar.grid(column=2, row=5, sticky=(W, E)) 

#Creates yes check button 
novar = ttk.Checkbutton(mainframe, text='No', command=changed2, variable=no) 
novar.grid(column=3, row=5, sticky=(W, E)) 

ttk.Label(mainframe, text="Accept Policy").grid(column=1, row=5, sticky=(W)) 

#Adds a calculate button 
ttk.Button(mainframe, text="Submit", command=submit).grid(column=3, row=9, sticky=W) 

ttk.Label(mainframe, textvariable=printer).grid(column=2, row=9, sticky=(E)) 

root.bind('<Return>', submit) 

#Keeps the gui running 
root.mainloop() 
+0

請添加錯誤日誌。 – harshil9968

+0

帶有'and'和'or'的複雜表達式,您應該總是使用圓括號將子表達式分組。評估順序很可能與您所期望的不同。將「if」分佈在多行上也會極大地提高可讀性。 –

回答

0

您不需要多次測試option。使用if first.get():而不是if first.get() != ""
您正在測試yes中的第二個if聲明,因此請從第一個聲明中刪除它(需要顯示不同的消息框)。

# Check required fields 
if first.get() and last.get() and option.get() and state.get(): 
    # Check Constraints before saving 
    if yes.get() == '1':