Python 如何修复name错误:name';变量名称';没有定义吗?

Python 如何修复name错误:name';变量名称';没有定义吗?,python,variables,tkinter,sqlite,Python,Variables,Tkinter,Sqlite,因此,我得到了错误NameError:name'chris'没有定义,我怀疑它与全局变量和局部变量有关,但是我已经在函数中将'chris'声明为全局变量 代码如下: def ChrisFood(): global chris chris = 1 FoodSelection() def JoshFood(): global josh josh = 1 FoodSelection() def SamFood(): global sam

因此,我得到了错误NameError:name'chris'没有定义,我怀疑它与全局变量和局部变量有关,但是我已经在函数中将'chris'声明为全局变量

代码如下:

def ChrisFood():
    global chris
    chris = 1
    FoodSelection()

def JoshFood():
    global josh
    josh = 1
    FoodSelection()

def SamFood():
    global sam
    sam = 1
    FoodSelection()

def DanielFood():
    global daniel
    daniel = 1
    FoodSelection()

def JimFood():
    global jim
    jim = 1
    FoodSelection()

def SeanFood():
    global sean
    sean = 1
    FoodSelection()

def FoodSelection():

    global FoodSelectionWindow
    FoodSelectionWindow = Tk()
    FoodSelectionWindow.configure(bg="black")
    DateAdded = datetime.date.today

    FoodSelectionPlaceHolder = Label(FoodSelectionWindow, text = "Food selection will be added in the third iteration")
    FoodSelectionPlaceHolder.grid(columnspan=10)

    if chris == 1:
        with db:
            cursor.execute(''' INSERT INTO 'Breakfast_History' (CaloriesTotal, DateAdded, PupilNames) VALUES (?,?,?)''',
                           ([TotalCalories, DateAdded, "Chris"]))
    elif josh == 1:
        with db:
            cursor.execute(''' INSERT INTO 'Breakfast_History' (CaloriesTotal, DateAdded, PupilNames) VALUES (?,?,?)''',
                       ([TotalCalories, DateAdded, "Josh"]))
    elif sam == 1:
        with db:
            cursor.execute(''' INSERT INTO 'Breakfast_History' (CaloriesTotal, DateAdded, PupilNames) VALUES (?,?,?)''',
                       ([TotalCalories, DateAdded, "Sam"]))
    elif daniel == 1:
        with db:
            cursor.execute(''' INSERT INTO 'Breakfast_History' (CaloriesTotal, DateAdded, PupilNames) VALUES (?,?,?)''',
                       ([TotalCalories, DateAdded, "Daniel"]))
    elif jim == 1:
        with db:
            cursor.execute(''' INSERT INTO 'Breakfast_History' (CaloriesTotal, DateAdded, PupilNames) VALUES (?,?,?)''',
                       ([TotalCalories, DateAdded, "Jim"]))

    elif sean == 1:
        with db:
            cursor.execute(''' INSERT INTO 'Breakfast_History' (CaloriesTotal, DateAdded, PupilNames) VALUES (?,?,?)''',
                       ([TotalCalories, DateAdded, "Sean"]))

    db.commit()
任何帮助都将不胜感激


谢谢。

为某个对象定义全局变量并不是为脚本中的所有函数定义全局变量。这不是global的工作方式。全局将局部变量更改为全局范围请参见:

x = 1

def foo():
    x = 2   #<--- is a local variable x

def bar():
    global x 
    x = 3   #<--- became the global x
    print('changing global x')

foo()
print(x) # 1
bar()    #changing global x
print(x) # 3
foo()
print(x) # 3
然后在你的
FoodSelection
中,让它接受一个参数,如果
关闭它:

def FoodSelection(choice):
    #what you have in here skipping to if

    if choice == 'chris':
        #do chris things

    elif choice == 'josh':
        #do josh things

如果可能,不要依赖于
global
。总有比使用
global

更好的方法来做事情。为某个对象定义全局变量并不能为脚本中的所有函数定义它。这不是global的工作方式。全局将局部变量更改为全局范围请参见:

x = 1

def foo():
    x = 2   #<--- is a local variable x

def bar():
    global x 
    x = 3   #<--- became the global x
    print('changing global x')

foo()
print(x) # 1
bar()    #changing global x
print(x) # 3
foo()
print(x) # 3
然后在你的
FoodSelection
中,让它接受一个参数,如果
关闭它:

def FoodSelection(choice):
    #what you have in here skipping to if

    if choice == 'chris':
        #do chris things

    elif choice == 'josh':
        #do josh things

如果可能,不要依赖于
global
。总有比使用
global

FoodSelection
更好的方法,它没有定义
chris
josh
,等等……但是它们已经在其他函数中定义了,它们是全局变量,所以肯定应该在整个代码中定义它们?不,这不是变量作用域的工作方式。同时停止使用
global
,如果一个函数需要另一个函数的变量,请将其作为参数传入。
FoodSelection
没有
chris
josh
,etc定义了…但是它们已经在其他函数中定义了,它们是全局变量,所以它们肯定应该在整个代码中定义?不,变量作用域不是这样工作的。同时停止使用
global
,如果一个函数需要另一个函数的变量,请将其作为参数传入。