NameError: имя ' ' не определено

У меня есть эта программа, и я хотел бы, чтобы она запускала каждый пункт меню. В основном пользователь входит в систему, появляется меню, и нажатие одного работает. Однако, когда я нажимаю 2, он говорит мне, что «Поиск студента не определен». Я не понимаю, о чем идет речь. Я пытался переместить функцию в программе, но получаю другие ошибки, если делаю это. Я ищу, как правильно структурировать это. Функции идут перед меню? а после логина? тогда как я могу и должен вызывать их?

choice = input
def PrintMenu():
    print("\n*******************")
    print("\n School menu system")
    print("\n*******************")
    print("  [1] Add Student")
    print("  [2] Search Student")
    print("  [3] Find Report")
    print("  [4] Exit")
    choice = input ("Enter a choice: ")
#while choice =='':
    if choice == '1':
        AddStudent()
    elif choice == '2':
        SearchStudent(ID)
    elif choice == '3':
        FindReport()
    elif choice == '4':
        print("\nExiting the system......\n")
        sys.exit(0)
    else:
           print ("\n not valid choice")
PrintMenu()
def SearchStudent(ID):
    with open("Students.txt", 'r') as file:
        for i in file:
            data = i.rstrip().split(",")
            if data[0] == ID:
                return "The student you require is: {} {}".format(data[2], data[1])
    return "No matches found"
search = input("Please enter a student ID: ")
print(SearchStudent(search))

person CV9    schedule 23.09.2017    source источник


Ответы (1)


Вы должны поместить SearchStudent(ID) перед вашей основной функцией. В Python вещи (например, функции) должны быть определены до их вызова.

Основной раздел должен идти после функций, которые вы собираетесь использовать. Поскольку ваша функция входа в систему должна быть основной, вы должны сообщить об этом программе. Добавьте это в конец вашего кода:

if __name__== "__main__":
  yourMainFunction()

Ваш код, скорее всего, будет выглядеть так:

def FindReport(args):
  #What it's going to do

def SearchStudent(args):
  #What it's going to do 

def AddStudent(args):
  #What it's going to do

def PrintMenu():
  #What it's going to do

def Login():
   #Your main function

if __name__ == "__main__":
   Login()
person Rodrigo Pereira    schedule 23.09.2017
comment
Я не понимаю, где находится основной раздел в коде или куда он должен идти. Перед меню есть функция входа в систему, а затем есть функция addstudent, и я пытался поместить ее до и после меню, и все равно возникает та же ошибка. - person CV9; 24.09.2017
comment
@cᴏʟᴅsᴘᴇᴇᴅ есть идеи? или предложения? - person CV9; 24.09.2017
comment
Я обновил ответ с дополнительной помощью. - person Rodrigo Pereira; 24.09.2017
comment
Я попробовал это, используя вашу структуру, и она по-прежнему сначала вызывает поиск студентов. Это должен быть логин, а затем меню. Я их всех тоже обзвонил в основном разделе, я должен был это сделать? - person CV9; 24.09.2017
comment
Хммм... если вы имеете в виду часть if name под main, то вот почему. Логин должен быть единственным там, иначе он будет вызывать все функции сразу (и, в вашем случае, учитывая, что поиск студентов, вероятно, был первой функцией, которую получил main, он вызвал ее первым). - person Rodrigo Pereira; 24.09.2017
comment
Я поместил Логин и Меню в if_name_==main: так что под этим я сделал Login() PrintMenu() - person CV9; 24.09.2017
comment
Я получаю эту ошибку, когда ищу студента, выбирая 2 в меню SearchStudent() TypeError: SearchStudent() отсутствует 1 обязательный позиционный аргумент: «ID» - person CV9; 24.09.2017
comment
Хм... ну, обо всем по порядку. Меню не должно быть, если name == main. Там должен быть только Login(), поэтому обязательно удалите его. Что касается вашей ошибки, вы уверены, что идентификатор переменной существует? Я посмотрел на ваш код, и его нигде не видно (пока что я только заметил выбор), поэтому может быть, почему он выдает эту ошибку. Я бы рекомендовал создать входную переменную ID, если пользователь выбирает 2. - person Rodrigo Pereira; 24.09.2017
comment
Спасибо за вашу помощь. Будет ли переменная объявлена ​​в меню или в функции поиска студентов? Также я удалил меню печати из главного меню, и оно ничего не делало после того, как я вошел в систему, поэтому оно вызывает функцию входа в систему, но ничего больше, это так сбивает с толку. - person CV9; 24.09.2017
comment
Пожалуйста. Что касается вашего вопроса, то он должен быть объявлен в меню, иначе будет та же ошибка (учитывая, что ваша функция ничего не получит). Что касается вашей функции входа в систему, это может быть связано с тем, что в ней нет ничего, что ссылалось бы на вашу функцию PrintMenu. Мое предложение состоит в том, чтобы вызвать PrintMenu() внутри него, если вход в систему выполнен успешно. - person Rodrigo Pereira; 24.09.2017
comment
Итак, я только что запустил его, и вход в систему в основном работает, а в нижней части входа я вызвал меню печати. Теперь я заставил его работать, сделав именно то, что вы сказали, и переместив поиск = ввод в систему меню. Отлично, мне нужно еще кое-что сделать, чтобы закончить программу. Мне нужно зациклить это меню для одного. Спасибо!! Я отмечу его как отвеченный, и я ценю всю оказанную помощь и поддержку. - person CV9; 24.09.2017
comment
Пожалуйста! Рад помочь. - person Rodrigo Pereira; 24.09.2017