Reputation:
I have a small window with Tkinter that I use to insert, update and delete fields in a database. The window consists of the Treeview ranking, the textboxes in which to insert the text and the buttons: Insert, Update, Delete.
PROBLEM: when I click on the "Update" or "Delete" buttons, the following error appears (error same as both, ie selected_item to Update, and selected_item to Delete)
NameError: name 'selected_item' is not defined
Here is the code I use. It's a bit long, but it's quite simple and intuitive (I remove some parts useful for operation, in order to lengthen the code and improve readability):
# GUI
frame_search = Frame(app)
frame_search.grid(row=0, column=0)
barrasopra=Frame(app, width=2200, height=47, background="#d9d9d9")
barrasopra.place(x=1, y=1)
barradue=Frame(app, width=2200, height=47, background="#78c030")
barradue.place(x=1, y=47)
#CLASS DATABASE
class Database:
def __init__(self, db):
self.conn = sqlite3.connect(db)
self.cur = self.conn.cursor()
self.cur.execute(
"CREATE TABLE IF NOT EXISTS routers (id INTEGER PRIMARY KEY, Relaz_Campionato integer, Relaz_Giornata integer, Data numeric, Ora numeric, Relaz_Sq1 integer, Relaz_Sq2 integer, Risultato_Sq1 integer, Risultato_Sq2 integer)")
self.conn.commit()
def fetch(self, hostname=''):
self.cur.execute(
"SELECT * FROM routers WHERE hostname LIKE ?", ('%'+hostname+'%',))
rows = self.cur.fetchall()
return rows
def fetch2(self, query):
self.cur.execute(query)
rows = self.cur.fetchall()
return rows
def insert(self, Relaz_Campionato, Relaz_Giornata, Data, Ora, Relaz_Sq1, Relaz_Sq2, Risultato_Sq1, Risultato_Sq2):
self.cur.execute("INSERT INTO ARCHIVIO_Risultati VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?)",
(Relaz_Campionato, Relaz_Giornata, Data, Ora, Relaz_Sq1, Relaz_Sq2, Risultato_Sq1, Risultato_Sq2))
self.conn.commit()
def remove(self, id):
self.cur.execute("DELETE FROM routers WHERE id=?", (id,))
self.conn.commit()
def update(self, id, Relaz_Campionato, Relaz_Giornata, Data, Ora, Relaz_Sq1, Relaz_Sq2, Risultato_Sq1, Risultato_Sq2):
self.cur.execute("UPDATE ARCHIVIO_Risultati SET Relaz_Campionato = ?, Relaz_Giornata = ?, Data = ?, Ora = ?, Relaz_Sq1 = ?, Relaz_Sq2 = ?, Risultato_Sq1 = ?, Risultato_Sq2 = ? WHERE id = ?",
(Relaz_Campionato, Relaz_Giornata, Data, Ora, Relaz_Sq1, Relaz_Sq2, Risultato_Sq1, Risultato_Sq2, id))
self.conn.commit()
def __del__(self):
self.conn.close()
conn= sqlite3.connect('/home/db.db')
cur= conn.cursor()
db= Database('/home/db.db')
def select_router(event):
try:
global selected_item
index = router_tree_view.selection()[0]
selected_item = router_tree_view.item(index)['values']
Relaz_Campionato_entry.delete(0, END)
Relaz_Campionato_entry.insert(END, selected_item[1])
Relaz_Giornata_entry.delete(0, END)
Relaz_Giornata_entry.insert(END, selected_item[2])
#######################################################
Data_entry.delete(0, END)
Data_entry.insert(END, selected_item[3])
Ora_entry.delete(0, END)
Ora_entry.insert(END, selected_item[4])
Relaz_Sq1_entry.delete(0, END)
Relaz_Sq1_entry.insert(END, selected_item[5])
Relaz_Sq2_entry.delete(0, END)
Relaz_Sq2_entry.insert(END, selected_item[6])
Risultato_Sq1_entry.delete(0, END)
Risultato_Sq1_entry.insert(END, selected_item[7])
Risultato_Sq2_entry.delete(0, END)
Risultato_Sq2_entry.insert(END, selected_item[8])
except IndexError:
pass
def remove_router():
db.remove(selected_item[0])
clear_text()
populate_list()
def update_router():
db.update(selected_item[0], Relaz_Campionato_text.get(), Relaz_Giornata_text.get(), Data_text.get(), Ora_text.get(), Relaz_Sq1_text.get(),
Relaz_Sq2_text.get(), Risultato_Sq1_text.get(), Risultato_Sq2_text.get())
populate_list()
def clear_text():
Data_entry.delete(0, END)
Ora_entry.delete(0, END)
Relaz_Sq1_entry.delete(0, END)
Relaz_Sq2_entry.delete(0, END)
Risultato_Sq1_entry.delete(0, END)
Risultato_Sq2_entry.delete(0, END)
def execute_query():
query = query_search.get()
populate_list2(query)
# FIELDS DATABASE
# Data
Data_text = StringVar()
Data_label = Label(app, text='Data', font=('bold', 11), bg='#f0f0f0', foreground='black')
Data_label.place(x=6, y=380)
Data_entry = Entry(app, textvariable=Data_text)
Data_entry.place(x=180, y=380)
# Ora
Ora_text = StringVar()
Ora_label = Label(app, text='Ora', font=('bold', 11), bg='#f0f0f0', foreground='black')
Ora_label.place(x=6, y=420)
Ora_entry = Entry(app, textvariable=Ora_text)
Ora_entry.place(x=180, y=418)
and others that I don't write
#FRAME RISULTATI, CON VISUALIZZAZIONE AD ALBERO
frame_router = Frame(app, bg='#d9d9d9')
frame_router.place(x=6, y=105)
columns = ['id', 'Data', 'Ora', 'Sq1', 'Sq2', 'Risultat1', 'Risultato2']
router_tree_view = Treeview(frame_router, columns=columns, show="headings")
router_tree_view.column("id", width=30)
for col in columns[1:]:
router_tree_view.column(col, width=170)
router_tree_view.heading(col, text=col)
router_tree_view.bind('<<TreeviewSelect>>', select_router)
router_tree_view.pack(side="left", fill="y")
scrollbar = Scrollbar(frame_router, orient='vertical')
scrollbar.configure(command=router_tree_view.yview)
scrollbar.pack(side="right", fill="y")
router_tree_view.config(yscrollcommand=scrollbar.set)
#COLORE TABELLA
style = ttk.Style(app)
style.configure("Treeview",
background="white",
foreground="#000000",
rowheight=25,
fieldbackground="white")
style.map('Treeview', background=[('selected', '#99d260')])
#RECALL BUTTONS
def populate_list(hostname=''):
for i in router_tree_view.get_children():
router_tree_view.delete(i)
for row in db.fetch(hostname):
router_tree_view.insert('', 'end', values=row)
def populate_list2(query='select * from routers'):
for i in router_tree_view.get_children():
router_tree_view.delete(i)
for row in db.fetch2(query):
router_tree_view.insert('', 'end', values=row)
def add_router():
if Relaz_Campionato_text.get() == '' or Relaz_Giornata_text.get() == '' or Data_text.get() == '' or Ora_text.get() == '' or Relaz_Sq1_text.get() == '' or Relaz_Sq2_text.get() == '' or Risultato_Sq1_text.get() =='' or Risultato_Sq2_text.get()=='':
messagebox.showerror('Required Fields', 'Please include all fields')
return
db.insert(Relaz_Campionato_text.get(), Relaz_Giornata_text.get(), Data_text.get(), Ora_text.get(), Relaz_Sq1_text.get(), Relaz_Sq2_text.get(), Risultato_Sq1_text.get(), Risultato_Sq2_text.get())
clear_text()
populate_list()
#Populate data
populate_list()
#BUTTON
frame_btns = Frame(app, bg='#d9d9d9')
frame_btns.place(y=2)
add_btn = Button(frame_btns, text='Aggiungi nuovo', width=12, bg='#78c030', command=add_router)
add_btn.grid(row=0, column=0, pady=7, padx=7)
remove_btn = Button(frame_btns, text='Rimuovi',
width=12, bg='#78c030', command=remove_router)
remove_btn.grid(row=0, column=1, padx=7)
update_btn = Button(frame_btns, text='Aggiorna',
width=12, bg='#78c030', command=update_router)
update_btn.grid(row=0, column=2, padx=7)
clear_btn = Button(frame_btns, text='Pulisci',
width=12, bg='#78c030', command=clear_text)
clear_btn.grid(row=0, column=3, padx=7)
Upvotes: 1
Views: 1089
Reputation: 65
Typically this is because of case sensitive, mis-spelling, or just forgetting to even define it in the first place. If it is none of the above problem, you need check if you defined selected_item before being used. If it is defined before calling, then check if there is anything that deletes it, such as del selected_item, you can always print out the variable to see what it is.
Upvotes: 1