2017-06-23 20 views
0

基本的には、ログインの詳細を辞書に格納し、ログオンし、入力が追加されたログインの詳細と一致する場合はlogged()関数を呼び出すプログラムを作成しています。しかし、私の2番目のメニューには問題があるようです。これは、入力を処理していないlog()関数であり、whileループは途切れることなく継続します。そして、ログインの詳細を尋ねるもう一度(ログインの詳細はまだ動作します)。 logged()メニューにnull入力を入力すると、 "それは有効なオプションではありませんでした。もう一度やり直してください"と表示され、予想される入力はその関数を呼び出す必要があります。これらのwhileループは現時点で私にとってはあまりにも混乱しており、validintro変数をTrueまたはFalseに切り替えようとしました。ヘルプをいただければ幸いです。Python:whileループの終了を終了する

vault = {} 

def menu(): 
    mode = input("""Hello {}, below are the modes that you can choose from:\n 
    ########################################################################## 
    a) Login with username and password 
    b) Register as a new user 
    To select a mode, enter the corresponding letter of the mode below 
    ##########################################################################\n 
    > """.format(name)).strip() 
    return mode 

def login(): 
    if len(vault) > 0 : #user has to append usernames and passwords before it asks for login details 
     print("Welcome to the login console") 
     while True: 
      username = input ("Enter Username: ") 
      if username == "": 
       print("User Name Not entered, try again!") 
       continue 
      password = input ("Enter Password: ") 
      if password == "": 
       print("Password Not entered, try again!") 
       continue 
      try: 
       if vault[username] == password: 
        print("Username matches!") 
        print("Password matches!") 
        logged() #jumps to logged function and tells the user they are logged on 
      except KeyError: #the except keyerror recognises the existence of the username and password in the list 
       print("The entered username or password is not found!") 

    else: 
     print("You have no usernames and passwords stored!") 

def register(): #example where the username is appended. Same applies for the password 
    print("Please create a username and password into the password vault.\n") 

    while True: 
     validname = True 
     while validname: 
      username = input("Please enter a username you would like to add to the password vault. NOTE: Your username must be at least 3 characters long: ").strip().lower() 
      if not username.isalnum(): 
       print("Your username cannot be null, contain spaces or contain symbols \n") 
      elif len(username) < 3: 
       print("Your username must be at least 3 characters long \n") 
      elif len(username) > 30: 
       print("Your username cannot be over 30 characters \n") 
      else: 
       validname = False 
     validpass = True 

     while validpass: 
      password = input("Please enter a password you would like to add to the password vault. NOTE: Your password must be at least 8 characters long: ").strip().lower() 
      if not password.isalnum(): 
       print("Your password cannot be null, contain spaces or contain symbols \n") 
      elif len(password) < 8: 
       print("Your password must be at least 8 characters long \n") 
      elif len(password) > 20: 
       print("Your password cannot be over 20 characters long \n") 
      else: 
       validpass = False #The validpass has to be True to stay in the function, otherwise if it is false, it will execute another action, in this case the password is appended. 
     vault[username] = password 
     validinput = True 
     while validinput: 
      exit = input("\nEnter 'end' to exit or any key to continue to add more username and passwords:\n> ") 
      if exit in ["end", "End", "END"]: 
       return 
      else: 
       validinput = False 
       register() 
     return register 

#LOGGED ONTO THE PASSWORD AND WEBSITE APP ADDING CONSOLE---------------------------------------------------------------------------------- 

def logged(): 
    print("You are logged in!\n") 
    modea = input("""Below are the options you can choose: 
    ##########################################################################\n 
    1) Call test1 function 
    2) Call test2 function 
    3) Exit 
    ##########################################################################\n 
    > """).strip() 
    return modea  

#Main routine 
print("Welcome to the password vault program") 
print("In this program you will be able to store your usernames and passwords in password vaults and view them later on.\n") 
validintro = False 
while not validintro: 
    name = input("Hello user, what is your name?: ") 
    if len(name) < 1: 
     print("Please enter a name: ") 
    elif len(name) > 30: 
     print("Please enter a name no more than 30 characters: ") 
    else: 
     validintro = True 
     print("Welcome to the password vault program {}.".format(name)) 

#The main program to run in a while loop for the program to keep on going back to the menu part of the program for more input till the user wants the program to stop 
validintro = False 
while not validintro: 
     chosen_option = menu() #a custom variable is created that puts the menu function into the while loop 
     validintro = False 

     if chosen_option in ["a", "A"]: 
      login() 

     elif chosen_option in ["b", "B"]: 
      register() 

     else: 
      print("""That was not a valid option, please try again:\n """) 
      validintro = False 

validintro = False 
while not validintro:   
    option = logged() 
    print(option) 
    if option == "1": 
     test1() 

    elif option == "2": 
     test2() 

    elif option == "3": 
     break 
    else: 
     print("That was not a valid option, please try again: ") 
     validintro = False 

print("Goodbye") 

答えて

1

ログに記録された()関数のループに問題があります。記録された機能はメニューを印刷し、入力を読み込むだけです。それは他のことをしません。このようなものを追加する必要があります。

def logged(): 
    print("You are logged in!\n") 
    keeplooping = True 
    while keeplooping: 
     modea = input("""Below are the options you can choose: 
     ########################################################################## 
     1) Call test1 function 
     2) Call test2 function 
     3) Exit 
     ########################################################################## 
     > """).strip() 

     if modea == "1": 
      print("Run Test 1\n") 
     elif modea == "2": 
      print("Run Test 2\n") 
     elif modea == "3": 
      keeplooping = False 
     else: 
      print("That was not a valid option, please try again\n") 
    return modea  
関連する問題