Пожалуйста, помогите мне с глобальной переменной

#python #global-variables

Вопрос:

Итак, вот мой код, я следовал инструкциям этого парня https://www.youtube.com/watch?v=YXPyB4XeYLAamp;t=13094s @4:35:30

Часть, на которой я остановился, — это когда он говорил об использовании глобальной переменной.

Всякий раз, когда я нажимаю обновить запись, она показывает мне сообщение об ошибке

строка 80, в обновлении «первый»: f_name_editor.get(), ошибка имени: имя «f_name_editor» не определено

Поэтому я вернулся, чтобы проверить глобальную переменную, в ней говорится:

Глобальная переменная ‘f_name_editor’ не определена на уровне модуля

У меня уже нет идей, и я все еще не могу понять этого. Я выполнил все шаги и ходил взад и вперед, чтобы посмотреть, не пропустил ли я что-нибудь во время видео, и я все еще не могу найти проблему

Пожалуйста, помогите мне!

 from tkinter import *
import sqlite3

root = Tk()
root.title('Family Member List')
root.geometry('400x400')

conn = sqlite3.connect('Family_list.db')

c = conn.cursor()



'''
c.execute("""CREATE TABLE family(
    first_name text,
    last_name text,
    gender text,
    occupation text
    )
    #""")
'''

#Edit function to update record
def edit():
    editor = Tk()
    editor.title('Update Record')
    editor.geometry('400x400')
    conn = sqlite3.connect('Family_list.db')
    c = conn.cursor()

    record_id = delete_box.get()
    c.execute("SELECT * FROM family WHERE oid ="   record_id)
    records = c.fetchall()

    global f_name_editor
    f_name_editor = Entry(editor,width=30)
    f_name_editor.grid(row=0, column=1, padx=20)
    l_name_editor = Entry(editor,width=30)
    l_name_editor.grid(row=1, column=1, padx=20)
    gender_editor = Entry(editor,width=30)
    gender_editor.grid(row=2, column=1, padx=20)
    occupation_editor = Entry(editor,width=30)
    occupation_editor.grid(row=3, column=1, padx=20)


    f_name_label = Label(editor,text= 'First Name')
    f_name_label.grid(row=0, column =0)
    l_name_label = Label(editor,text= 'Last Name')
    l_name_label.grid(row=1, column =0)
    gender_label = Label(editor,text= 'Gender')
    gender_label.grid(row=2, column =0)
    occupation_label = Label(editor,text= 'Occupation')
    occupation_label.grid(row=3, column =0)

    # LOOP THROUGH RESULT
    for record in records:
        f_name_editor.insert(0, record[0])
        l_name_editor.insert(0, record[1])
        gender_editor.insert(0, record[2])
        occupation_editor.insert(0, record[3])

    #Save Button after edited
    edit_btn = Button(editor, text='Save Record', command = update)
    edit_btn.grid(row=6, column = 1, columnspan = 2, pady=10, padx = 10, ipadx= 100)

def update():
    conn = sqlite3.connect('Family_list.db')
    c = conn.cursor()

    record_id = delete_box.get()
    c.execute('''UPDATE family SET
        first_name=:first,
        last_name=:last,
        gender=:gender,
        occupation=:occupation

        WHERE oid = :oid''',
              {
                  'first': f_name_editor.get(),
                  'last': l_name_editor.get(),
                  'gender': gender_editor.get(),
                  'occupation': occupation_editor.get(),

                  'oid': record_id
              })
    conn.commit()
    conn.close()


def delete():
    conn = sqlite3.connect('Family_list.db')
    c = conn.cursor()
    c.execute("DELETE from family WHERE oid="   delete_box.get())
    conn.commit()
    conn.close()

def submit():
    conn = sqlite3.connect('Family_list.db')
    c = conn.cursor()
    c.execute("INSERT INTO family VALUES (:f_name,:l_name,:gender,:occupation)",
            {
                'f_name':f_name.get(),
                'l_name':l_name.get(),
                'gender': gender.get(),
                'occupation': occupation.get(),
            })

    conn.commit()
    conn.close()
    f_name.delete(0,END)
    l_name.delete(0,END)
    gender.delete(0,END)
    occupation.delete(0,END)

def query():
    conn = sqlite3.connect('Family_list.db')
    c = conn.cursor()
    c.execute('SELECT *, oid FROM family')
    records = c.fetchall()
    print(records)
    conn.commit()
    conn.close()

    print_records = ''
    for record in records:
        print_records  = str(record[0])   " t "  str(record[4])  'n'

    query_label = Label(root,text= print_records)
    query_label.grid(row = 8 ,column = 0, columnspan =2 )



f_name = Entry(root,width=30)
f_name.grid(row=0, column=1, padx=20)
l_name = Entry(root,width=30)
l_name.grid(row=1, column=1, padx=20)
gender = Entry(root,width=30)
gender.grid(row=2, column=1, padx=20)
occupation = Entry(root,width=30)
occupation.grid(row=3, column=1, padx=20)
delete_box= Entry(root, width=30)
delete_box.grid(row=9, column = 1)


#create global variable


f_name_label = Label(root,text= 'First Name')
f_name_label.grid(row=0, column =0)
l_name_label = Label(root,text= 'Last Name')
l_name_label.grid(row=1, column =0)
gender_label = Label(root,text= 'Gender')
gender_label.grid(row=2, column =0)
occupation_label = Label(root,text= 'Occupation')
occupation_label.grid(row=3, column =0)
delete_box_label = Label(root, text = 'Select ID Number')
delete_box_label.grid(row=9, column= 0)

#BUTTONS
submit_btn = Button(root,text='Add Record to Database', command= submit)
submit_btn.grid(row = 4, column =0, columnspan=2, pady=10, padx =10, ipadx=100)
query_btn = Button(root, text='Check Submission', command = query)
query_btn.grid(row=5, column = 0, columnspan = 2, pady=10, padx = 10, ipadx= 100)
delete_btn = Button(root, text='Delete Record', command = delete)
delete_btn.grid(row=10, column = 0, columnspan = 2, pady=10, padx = 10, ipadx= 100)

#Update Button
edit_btn = Button(root, text='Update Record', command = update)
edit_btn.grid(row=11, column = 0, columnspan = 2, pady=10, padx = 10, ipadx= 100)


conn.commit()
conn.close()
root.mainloop()
 

Комментарии:

1. Добро пожаловать в SO. Пожалуйста, укажите полную ошибку отслеживания.

2. f_name_editor назначается в edit() функции. Вы никогда не вызываете эту функцию.

3. Боже, спасибо вам, ребята, что указали на это. Простое изменение команды в строке 172 полностью решило бы проблему edit_btn = Кнопка(root, текст=»Обновить запись», команда = редактировать) Внезапное осознание пришло, и я чувствую себя очень глупо из-за этого.. СПАСИБО ВАМ ВСЕМ!!

Ответ №1:

f_name_editor не существует в глобальной области видимости до тех пор, пока edit функция не создаст ее. Путь к коду, вызывающий update функцию, не проходит через edit функцию, поэтому глобальная переменная в этот момент не существует. Вы могли бы объявить его в глобальном масштабе, но, скорее всего, вы обнаружите, что это просто приводит к большему количеству ошибок.