Menus and submenus in Python

Question:

I am a complete beginner in learning Python. Currently working on an assignment and having issues in creating menu with submenus.I am trying to connect functions properly and make my program work.

How can I make my submenu work? Output doesnt show the submenu options.

type def display_header():
    main = "Main Menu"
    txt = main.center(90, ' ')
    print('{:s}'.format('u0332'.join(txt)))
    print("Please choose an option from the following menu:")
    print("I. Invitee's Information")
    print("F. Food Menu")
    print("D. Drinks Menu")
    print("P. Party Items Menu")
    print("Q. Exit")
    

def get_user_choice():
    
    choice = input("Enter your choice: ")
    return choice


def invitees_menu():


       invitees_menu()
    
    while True:
        choice = invitees_menu()
            
        if choice == "a":
             enter_invitee()
        if choice == "e":
               edit_invitee()
        if choice == "v":
             drinks_menu()    
        if choice == "b":
           display_header()


    print("Invitees' Information Menu")
    print("Please choose an option from the following menu:")
    print("A. Add new invitee information")
    print("E. Edit existing invitee information")
    print("V. View all invitees")
    print("B. Go back to main menu")
    choice = input("Enter your sub-menu choice: ")[0].lower
    return choice


if __name__ == "__main__":
    
    display_header()

    while True:
        choice = get_user_choice()
        
        if choice == "i":
            invitees_menu()
        if choice == "f":
            food_menu()
        if choice == "d":
            drinks_menu()
        if choice == "p":
            party_menu()    
        if choice == "q":
            print ("Thank you for using the program!")
            break
Asked By: Marko Stamenkovic

||

Answers:

I suggest as first step to clean up the mess with recursive function calls in following section:

def invitees_menu():


       invitees_menu()
    
    while True:
        choice = invitees_menu()

Next step in cleaning up the mess would be to remove the entire unnecessary parts of the code preventing the sub-menu from showing up when calling invitees_menu().

Answered By: Claudio

I might be wrong in understanding the code, but here’s what I think’s happened.
when you call your invitees_menu function it immediately calls itself. This breaks a rule of recursion (a function calling itself) and causes an infinite loop of just calling the start of the function over and over again. Which gives us this error:

RecursionError: maximum recursion depth exceeded

So first i’d remove the first invitees_menu line completely. Then in the while loop you’re calling the invitees_menu again. This is again the same problem because each time you call the function, it will call itself again and never get to returning any item. Here i’ve replaced it with:

print("Invitees' Information Menu")
print("Please choose an option from the following menu:")
print("A. Add new invitee information")
print("E. Edit existing invitee information")
print("V. View all invitees")
print("B. Go back to main menu")
choice = input("Enter your sub-menu choice: ")[0].lower

You then have the problem of never actually leaving the while True loop. Since entering B should break out and then go back to the main loop in the __main__ call, so i replaced the display_header with break.

Finally, the last few smaller things are:

  1. removing the "type" at line 1
  2. moving the display header in main inside the while loop
  3. fixing up the irregular tab structure in invitees_menu

And here it is


def display_header():
    main = "Main Menu"
    txt = main.center(90, ' ')
    print('{:s}'.format('u0332'.join(txt)))
    print("Please choose an option from the following menu:")
    print("I. Invitee's Information")
    print("F. Food Menu")
    print("D. Drinks Menu")
    print("P. Party Items Menu")
    print("Q. Exit")
    

def get_user_choice():
    
    choice = input("Enter your choice: ")
    return choice


def invitees_menu():

    while True:
        print("Invitees' Information Menu")
        print("Please choose an option from the following menu:")
        print("A. Add new invitee information")
        print("E. Edit existing invitee information")
        print("V. View all invitees")
        print("B. Go back to main menu")
        choice = input("Enter your sub-menu choice: ")[0].lower()
            
        if choice == "a":
            enter_invitee()
        if choice == "e":
            edit_invitee()
        if choice == "v":
            drinks_menu()    
        if choice == "b":
           break

    return choice


if __name__ == "__main__":
    
    display_header()

    while True:
        choice = get_user_choice()
        
        if choice == "i":
            invitees_menu()
        if choice == "f":
            food_menu()
        if choice == "d":
            drinks_menu()
        if choice == "p":
            party_menu()    
        if choice == "q":
            print ("Thank you for using the program!")
            break
Answered By: felix moeran
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.