简体   繁体   English

单击按钮时出错:NameError: name is not defined

[英]Error when clicking on button: NameError: name is not defined

I have a small window with Tkinter that I use to insert, update and delete fields in a database.我有一个带有 Tkinter 的小窗口,用于在数据库中插入、更新和删除字段。 The window consists of the Treeview ranking, the textboxes in which to insert the text and the buttons: Insert, Update, Delete.该窗口由 Treeview 排名、用于插入文本的文本框和按钮组成:插入、更新、删除。

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)问题:当我单击“更新”或“删除”按钮时,出现以下错误(错误与两者相同,即 selected_item 更新,selected_item 删除)

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)

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.如果不是上述问题,则需要在使用前检查是否定义了 selected_item 。 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.如果是在调用之前定义的,那么检查一下有没有删除它的东西,比如del selected_item,可以随时打印出变量看看是什么。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM