I've written a simple script with TKinter and SQLAlchemy, where an sqlite .db is created, saving Employee information such as name, age, address, etc, etc.
I realized that if a user puts a string in the age and/or zip field (both fields require int's), an error will be thrown. So I put a try-except clause in the add_data method. If a string is placed in the age field for instance, the except clause will be thrown correctly and the showinfo window will appear with the error, but when the user clicks 'ok' on the box, an UnboundLocalError: local variable 'age' referenced before assignment error will show in IDLE.
I have read "https://docs.python.org/2/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value" and the other similar questions to no avail.
The data (employee info) will be saved correctly when the user corrects the mistake (puts an int the field & clicks the Add button). However, I obviously don't want this UnboundLocalError being thrown. I just don't know how to correct it, or why it's being thrown to begin with. . .Any help is greatly appreciated as always!
from datetime import datetime
from Tkinter import *
from tkMessageBox import *
import sqlite3, sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, DateTime, Integer, String, MetaData
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker# map classes to tables through Base Class
Base = declarative_base()class Employee(Base):__tablename__ = 'employee'id = Column(Integer, primary_key=True)name = Column(String(250))age = Column(Integer)address = Column(String(250))city = Column(String(10))state = Column(String(2))zip = Column(Integer)ssn = Column(String(12))phone = Column(String(12))cell = Column(String(12))# create engine for Session connection
engine = create_engine('sqlite:///employee.db',echo=True)# create all tables in engine ('CREATE TABLE' in raw SQL)
Base.metadata.create_all(engine)# create configured 'Session' class
Session = sessionmaker(bind=engine)# create session
session = Session()class GUI:def __init__(self, parent):self.parent = parent# create top frameframe = Frame(parent)frame.pack(expand=YES, fill=BOTH, padx=5, pady=5)# create bottom framebtm_frame = Frame(parent, relief=SUNKEN, borderwidth=1)btm_frame.pack(side=BOTTOM, expand=YES, fill=BOTH, padx=5, pady=5)# create datetime objectd = datetime.today()date = d.strftime("%Y-%m-%d")#------------------------Create Labels-------------------------------## label to display datedate_label = Label(btm_frame, text=date)date_label.pack(side=LEFT)# name labelname_label = Label(frame, text="Enter Name:")name_label.grid(row=0, sticky=W)# age labelage_label = Label(frame, text="Enter Age:")age_label.grid(row=1, sticky=W)# address labeladdr_label = Label(frame, text="Enter Address:")addr_label.grid(row=2, sticky=W)# city labelcity_label = Label(frame, text="Enter City:")city_label.grid(row=3, sticky=W)# state labelstate_label = Label(frame, text="Enter State:")state_label.grid(row=4, sticky=W)# zip code labelzip_label = Label(frame, text="Enter Zip Code:")zip_label.grid(row=5, sticky=W)# ssn labelssn_label = Label(frame, text="Enter Social Security #:")ssn_label.grid(row=6, sticky=W)# phone labelphone_label = Label(frame, text="Enter Phone #:")phone_label.grid(row=7, sticky=W)# cell labelcell_label = Label(frame, text="Enter Cell #:")cell_label.grid(row=8, sticky=W)#----------------------Create Vars and Entry-------------------------## name variable and entryself.name_var = StringVar()self.e1 = Entry(frame, textvariable=self.name_var)self.e1.grid(row=0, column=1)# age variable and entryself.age_var = IntVar()self.e2 = Entry(frame, textvariable=self.age_var)self.e2.grid(row=1, column=1)# address variable and entryself.address_var = StringVar()self.e3 = Entry(frame, textvariable=self.address_var)self.e3.grid(row=2, column=1)# city variable and entryself.city_var = StringVar()self.e4 = Entry(frame, textvariable=self.city_var)self.e4.insert(0, "Roanoke") # insert default valueself.e4.grid(row=3, column=1)# state variable and entryself.state_var = StringVar()self.e5 = Entry(frame, textvariable=self.state_var)self.e5.insert(0, "VA") # insert default valueself.e5.grid(row=4, column=1)# zip code variable and entryself.zip_var = IntVar()self.e6 = Entry(frame, textvariable=self.zip_var)self.e6.grid(row=5, column=1)# s.s.n variable and entryself.ssn_var = StringVar()self.e7 = Entry(frame, textvariable=self.ssn_var)self.e7.grid(row=6, column=1)# phone variable and entryself.phone_var = StringVar()self.e8 = Entry(frame, textvariable=self.phone_var)self.e8.grid(row=7, column=1)# cell variable and entryself.cell_var = StringVar()self.e9 = Entry(frame, textvariable=self.cell_var)self.e9.grid(row=8, column=1)# quit, search, clear, add, delete buttonsquit_button = Button(btm_frame, text="Quit", relief=GROOVE, command=parent.destroy)quit_button.pack(side=RIGHT) search_button = Button(btm_frame, text="Search", relief=GROOVE, command=self.search)search_button.pack(side=RIGHT, padx=1, pady=1)clear_button = Button(btm_frame, text="Clear", relief=GROOVE, command=self.clear_entries)clear_button.pack(side=RIGHT, padx=1, pady=1) del_button = Button(btm_frame, text="Delete", relief=GROOVE, command=self.del_employee)del_button.pack(side=RIGHT, padx=1, pady=1)add_button = Button(btm_frame, text="Add", relief=GROOVE, command=self.add_data)add_button.pack(side=RIGHT, padx=1, pady=1)def add_data(self): name = self.name_var.get() try:age = self.age_var.get()except ValueError:showinfo("Error:", "Please Enter A Number In Age Field.") addr = self.address_var.get()city = self.city_var.get()state = self.state_var.get()zip = self.zip_var.get() ssn = self.ssn_var.get()phone = self.phone_var.get()cell = self.cell_var.get()# create new Employee in .dbnew_person = Employee(name=name, age=age, address=addr, city=city, state=state, zip=zip, ssn=ssn, phone=phone, cell=cell)session.add(new_person)session.commit()session.close()self.callback()return def callback(self): showinfo("New Employee", "Data Added")self.clear_entries()return def clear_entries(self):entries = [self.e1, self.e2, self.e3, self.e4, self.e5, self.e6, self.e7, self.e8, self.e9]for entry in entries:entry.delete(0, END)return def search(self):search_win = Toplevel()search_win.title("Employee Search")# create labels for each employee attributeattr = ["Id","Name","Age","Address","City","State","Zip","SSN","Cell","Phone"]column = 0for a in attr:Label(search_win, text=a).grid(row=0,column=column,padx=2, pady=2)column += 1# search all employees, put each emp. in Entry Widget with For Loopres = session.query(Employee).all()row = 1column = 0for employee in res:txt = [employee.id, employee.name, employee.age, employee.address, employee.city, employee.state, employee.zip, employee.ssn, employee.phone, employee.cell]for t in txt:ent = Entry(search_win, relief=RIDGE, width=19)ent.grid(row=row, column=column, sticky=W, padx=1, pady=1)ent.insert(0, t)column += 1row += 1column = 0returndef del_employee(self):del_win = Toplevel()del_win.title("Delete Employee")id_label = Label(del_win, text="Enter Employee Id:")id_label.grid(row=0, column=0, padx=5, pady=5)self.employee_id = IntVar()self.e10 = Entry(del_win, textvariable=self.employee_id)self.e10.grid(row=0, column=1, padx=5, pady=5)del_button = Button(del_win, text="Delete Employee", relief=GROOVE, command=self.erase)del_button.grid(row=0, column=2, padx=5, pady=5)returndef erase(self):emp_id = self.employee_id.get()res = session.query(Employee).filter(Employee.id==emp_id).first()session.delete(res)session.commit()showinfo("Employee", "Data Deleted")returnif __name__ == '__main__':root = Tk()root.geometry("310x270")root.title("Employee Info")mygui = GUI(root)root.mainloop()`