返回上一个菜单

时间:2018-01-17 19:24:55

标签: python command-line-interface

编辑:似乎人们不明白这一点...... 我有三个不同的函数可以调用一个常用函数。如何根据用户角色从常用功能返回到上一个功能?

我有这样的登录功能:

def login():
    users = open('users.txt', 'r').readlines()
    username = input("\nKorisnicko ime: ")
    password = input("Lozinka: ")
    for i in users:
        users=i.strip("\n").split("|")
        if (username == users[0] and password == users[1]):
            print("\nDobrodosli: " + users[2].title(), users[3].title()+"\n" )
            if users[4] == 'kupac':
                buyer_menu()
            elif users[4] == 'prodavac':
                seller_menu()
            elif users[4] == 'menadzer':
                manager_menu()

买家,卖家和经理的功能如下:

def buyer_menu():
    print("=== BUYER ===")
    print("1. Search movie")
    print("2. Search moive")
    print("7. Logout")
    print("8. Exit")
    options = input("\nChoose option >>> ")
    if options == '1':
        search_movie()
    elif options == '2':
        search.search_movie()
    ...
    elif options == '8':
        print ("Predstava je otkazana. Nestalo struje.")
        exit()
    else:
        print("Nepostojeca opcija!\n")
        buyer_menu()

卖方。

def seller_menu():
        print("=== SELLER ===")
        print("1. Search movie")
        print("2. Search ticket")
        print("7. Back to main menu")
        options = input("\nChoose option >>> ")
        if options == '1':
            search_movie()
        elif options == '2':
            search.search_movie()
        elif options == '7':
            main()
        elif options == '8':
            print ("Predstava je otkazana. Nestalo struje.")
            exit()
        else:
            print("Nepostojeca opcija!\n")
            buyer_menu()

管理器:

def manager_menu():
        print("=== MANAGE ===")
        print("1. Search movie")
        print("2. Search users")
        print("8. Exit")
        options = input("\nChoose option >>> ")
        if options == '1':
            search_movie()
        elif options == '2':
            search.search_users()
        elif options == '8':
            print ("Predstava je otkazana. Nestalo struje.")
            exit()
        else:
            print("Nepostojeca opcija!\n")
            buyer_menu()

嗨,你可以看到所有trhee类型的用户都有“搜索电影”选项,其功能如下:

def search_movie():
    print("\n1. Search movie title")
    print("2. Search movie genre")

    print("8. Back to main menu")

    options = input("\nUnesite kriterijum za pretragu >>> ") 
    if options == '1':
        search_movie_title()
    elif options == '2':
        search_movie_genre()

现在,如果你看到,问题是返回主菜单的功能.... 例如:如果我以买家身份登录并选择了搜索电影选项,但我想返回主菜单,如何备份buyer_menu(): 等等其他类型的用户...... seller_menu():上的卖家和manager_menu():上的经理

3 个答案:

答案 0 :(得分:1)

使用while循环

在尝试返回CLI菜单时,最佳做法是从while循环中激活此类菜单。

if users[4] == 'kupac':
    # Or some other suitable condition.
    while not exit:
        buyer_menu()

这样,一旦用户到达调用堆栈的末尾,用户将回退到login函数。然后下一个while循环迭代将它们带回正确的菜单。

"7. Back to main menu"选项应该只允许当前函数完成,并返回调用堆栈,返回到while循环,然后再循环调用用户角色的正确方法。我们这样做是为了在堆栈溢出之前不会不断增加调用堆栈。

示例和参考资料

答案 1 :(得分:1)

您不能将上一个菜单改为search_movie()吗?

def search_movie(user_menu):
    #...#
    elif options == '8'
        user_menu() # call the previous user menu again

当您致电search_movie()时,只需输入上一个功能名称:

def buyer_menu():
    #...#
    if options == '1':
        search_movie(buyer_menu) #include the context
    elif options == '2':
        search.search_movie(buyer_menu) #include the context
    #...#

你的代码看起来好像可以用来进行一些优化,但这不是问题的一部分,对我来说太麻烦了。

答案 2 :(得分:1)

第一个解决方案: 您可以通过以下函数传递用户对象:

def login():
    users = open('users.txt', 'r').readlines()
    username = input("\nKorisnicko ime: ")
    password = input("Lozinka: ")
    for i in users:
        users=i.strip("\n").split("|")
        if (username == users[0] and password == users[1]):
            print("\nDobrodosli: " + users[2].title(), users[3].title()+"\n" )
            if users[4] == 'kupac':
                buyer_menu(users[4])
            elif users[4] == 'prodavac':
                seller_menu(users[4])
            elif users[4] == 'menadzer':
                manager_menu(users[4])

使用此解决方案,您将用户角色传递给函数,这就是新功能将如何知道此用户角色的用途。

解决方案#2: 由于您将文件用作数据库,因此您还可以在某个currentUser.txt文件中保存用户登录的内容(仅限其凭据),并且每次调用一些读取该文件的函数来检查谁登录。

解决方案#3 :创建一个仅检查用户角色的功能,然后回复此基本'菜单。像这样:

def showStartMenu(currentUsersUsername):
    users = open('users.txt', 'r').readlines()
    for i in users:
        users=i.strip("\n").split("|")
        if (currentUsersUsername== users[0]):
            if users[4] == 'kupac':
                buyer_menu()
            elif users[4] == 'prodavac':
                seller_menu()
            elif users[4] == 'menadzer':
                manager_menu()

请记住,您需要传递当前用户的用户名。因此,只需使用与解决方案2和3的组合

编辑:向第一个解决方案添加示例

将用户[4]发送给函数后,您可以像这样使用它:

def seller_menu(usersRole):
        print("=== SELLER ===")
        print("1. Search movie")
        print("2. Search ticket")
        print("7. Back to main menu")
        options = input("\nChoose option >>> ")
        if options == '1':
            search_movie(usersRole)
        elif options == '2':
            search.search_movie()
        elif options == '7':
            main()
        elif options == '8':
            print ("Predstava je otkazana. Nestalo struje.")
            exit()
        else:
            print("Nepostojeca opcija!\n")
            buyer_menu()

现在搜索菜单:

def search_movie(usersRole):
    print("\n1. Search movie title")
    print("2. Search movie genre")

    print("8. Back to main menu")

    options = input("\nUnesite kriterijum za pretragu >>> ") 
    if options == '1':
        search_movie_title()
    elif options == '2':
        search_movie_genre()
    elif options == '8':
        if usersRole == 'kupac':
            buyer_menu()
        elif usersRole == 'prodavac':
            seller_menu()
        elif usersRole == 'menadzer':
            manager_menu()