Getting UnboundLocalError: local variable age referenced before assignment error

2024/10/5 16:01:12

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()`
Answer
       age = "" try:age = self.age_var.get()except ValueError:showinfo("Error:", "Please Enter A Number In Age Field.")

Have a look Here

https://en.xdnf.cn/q/119970.html

Related Q&A

Cannot run python script [duplicate]

This question already has answers here:What does "SyntaxError: Missing parentheses in call to print" mean in Python?(11 answers)Closed 9 years ago.I am trying to run this python script:https…

I want to read multiple audio files with librosa and then save it into an empty list

Here id my code . when I append into the array the array remain empty . Please help me where is the mistake. Or tell me some other way also to do thisA = [] # load more files with librosa pathAudio = …

How to db.execute in postgresql using the LIKE operator with variables within flask [duplicate]

This question already has an answer here:CS50: LIKE operator, variable substitution with % expansion(1 answer)Closed 4 years ago.Im trying to get my db.execute to work but encounter a syntax error when…

C, Perl, and Python similar loops different results

I wrote scripts to calculate pi in python, perl and c. They all use the same algorithm (trapezoidal reimann sum of a circle with n subintervals) and the python and perl programs always get the same re…

How to print a single backslash in python in a string? [duplicate]

This question already has answers here:Why do backslashes appear twice?(2 answers)Closed 1 year ago.In python (3x version)\ # this is error no doubt \\ # this prints two backslashes ,i.e., \\ r\ # thi…

Return nested JSON item that has multiple instances

So i am able to return almost all data, except i am not able to capture something like this:"expand": "schema""issues": [{"expand": "<>","id…

What request should I make to get the followers list from a specific profile page

I am trying to get the followers list from this profile, I tried making a GET request using python requests to the API using this request URL but it didnt seem to work, I got a METHOD_NOT_ALLOWED error…

PlayerDB API Post Requests bring 404

I made a little script to get the UUIDs of people who joined my minecraft server, then run them through the PlayerDB API through a post request to: https://playerdb.co/api/player/minecraft/* where the …

How to make changes using Configparser in .ini file persistent

How to modify the .ini file? My ini file looks like this. And i want the format section ini to be changed like this[Space to be replaced with a tab followed by $] Format="[%TimeStamp%] $(%Thre…

How to structure template libraries in a Django project? [closed]

Closed. This question is opinion-based. It is not currently accepting answers.Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.Clo…