aegirhall / console-menu

A simple Python menu system for building terminal user interfaces.
MIT License
365 stars 58 forks source link

Request: Additional documentation regarding layered menus #80

Open MSAdministrator opened 2 years ago

MSAdministrator commented 2 years ago

Hello, this is a request for an example / documentation changes regarding having multiple menus layered upon themselves. I have looked through all the examples and cannot figure out how to do this.

My specific example is three layers deep.

Main Menu -> Submenu -> Sub-Submenu

Do you mind providing an example and in return I will write up the docs for it.

Thanks for the help!

aegirhall commented 2 years ago

Hi @MSAdministrator ,

Here is a simple example showing submenus going 4 levels deep. There is no limit to how many submenu levels you can have. Each submenu is just an instance of ConsoleMenu (or SelectionMenu), that is launched with a SubmenuItem. Just make sure to provide the "parent" menu, so the child menu knows where to navigate when returning.

This is just a contrived example that doesn't do anything useful, but hopefully it helps with understanding how the submenuing works.

from consolemenu import *
from consolemenu.items import *

def example_menu_item_handler(*args):
    pu = PromptUtils(Screen())
    # <Printing here just as an example - do actual stuff here>
    pu.println("You selected {} menu item {}\n".format(args[0], args[1]))
    pu.enter_to_continue()

def main():
    # Create the root menu
    root_menu = ConsoleMenu("Root Menu", "This is the Root Menu")

    ################################################################################

    # Submenu 1.1.1.1 (Level 4)
    sub1_1_1_1 = ConsoleMenu("Sub-Menu 1.1.1.1", "This is Sub-Menu 1.1.1.1")
    sub1_1_1_1.append_item(FunctionItem("Item 1", example_menu_item_handler, ['submenu 1.1.1.1', 1]))
    sub1_1_1_1.append_item(FunctionItem("Item 2", example_menu_item_handler, ['submenu 1.1.1.1', 2]))

    # Submenu 1.1.1.2 (Level 4)
    sub1_1_1_2 = ConsoleMenu("Sub-Menu 1.1.1.2", "This is Sub-Menu 1.1.1.2")
    sub1_1_1_2.append_item(FunctionItem("Item 1", example_menu_item_handler, ['submenu 1.1.1.2', 1]))
    sub1_1_1_2.append_item(FunctionItem("Item 2", example_menu_item_handler, ['submenu 1.1.1.2', 2]))

    # Submenu 1.1.1.3 (Level 4)
    sub1_1_1_3 = ConsoleMenu("Sub-Menu 1.1.1.3", "This is Sub-Menu 1.1.1.3")
    sub1_1_1_3.append_item(FunctionItem("Item 1", example_menu_item_handler, ['submenu 1.1.1.3', 1]))
    sub1_1_1_3.append_item(FunctionItem("Item 2", example_menu_item_handler, ['submenu 1.1.1.3', 2]))

    ################################################################################

    # Submenu 1.1.1 (Level 3)
    sub1_1_1 = ConsoleMenu("Sub-Menu 1.1.1", "This is Sub-Menu 1.1.1")
    sub1_1_1.append_item(SubmenuItem("Open Sub-Menu 1.1.1.1", submenu=sub1_1_1_1, menu=sub1_1_1))
    sub1_1_1.append_item(SubmenuItem("Open Sub-Menu 1.1.1.2", submenu=sub1_1_1_2, menu=sub1_1_1))
    sub1_1_1.append_item(SubmenuItem("Open Sub-Menu 1.1.1.3", submenu=sub1_1_1_3, menu=sub1_1_1))

    # Submenu 1.1.2 (Level 3)
    sub1_1_2 = ConsoleMenu("Sub-Menu 1.1.2", "This is Sub-Menu 1.1.2")
    sub1_1_2.append_item(FunctionItem("Item 1", example_menu_item_handler, ['submenu 1.1.2', 1]))
    sub1_1_2.append_item(FunctionItem("Item 2", example_menu_item_handler, ['submenu 1.1.2', 2]))
    sub1_1_2.append_item(FunctionItem("Item 3", example_menu_item_handler, ['submenu 1.1.2', 3]))

    ################################################################################

    # Submenu 1.1 (Level 2)
    sub1_1 = ConsoleMenu("Sub-Menu 1.1", "This is Sub-Menu 1.1")
    sub1_1.append_item(SubmenuItem("Open Sub-Menu 1.1.1", submenu=sub1_1_1, menu=sub1_1))
    sub1_1.append_item(SubmenuItem("Open Sub-Menu 1.1.2", submenu=sub1_1_2, menu=sub1_1))

    ################################################################################

    #  Submenu 1 (Level 1)
    sub1 = ConsoleMenu("Sub-Menu 1", "This is Sub-Menu 1")
    sub1.append_item(SubmenuItem("Open Sub-Menu 1.1", submenu=sub1_1, menu=sub1))

    ################################################################################

    # Add root menu items (Level 0)
    root_menu.append_item(SubmenuItem("Open Sub-Menu 1", submenu=sub1, menu=root_menu))

    # Show the menu
    root_menu.start()
    root_menu.join()

if __name__ == "__main__":
    main()