2016-12-11 5 views
-4

私がしたいのは、ユーザーからの特定の入力を得ることです。入力が仕様と一致しない場合、エラーメッセージを数秒間表示して消して入力します再び。 例:以下は、私はユーザーから文字列を取得し、 '名前'という変数に格納したいと思います。文字列の長さは15以下でなければなりません。したがって、ユーザーが長さ20の文字列を入力した場合は、 'TOO LONG!(MAX:15)'という印字を行います。ユーザーが長すぎる文字列を供給し続けると、これはさらに進んでいきます。だから私は 'TOO LONG!(MAX:15)'を一度印刷して数秒後に消えて、ユーザーを上部のプロンプトに戻したいと思っています。 私はそれをしたいところである:Pythonでしばらくして文字列を消す方法

def get_contact(): 
    try: 
     while True: 
      name = input('\033[1m\nNAME: \033[0m') 
      if name.isalpha(): 
       if len(name) > 16: 
        print('\033[91m\033[1mTOO LONG!(MAX:15)\033[0m\033[0m') 
        continue 
       break 
      else: 
       print('\033[91m\033[1mALPHABETICAL CHARACTORS ONLY!\033[0m\ 
        \033[0m') 
     while True: 
      number = input('\033[1m\nNUMBER: \033[0m') 
      if number.isnumeric(): 
       if len(number) > 16: 
        print('\033[91m\033[1mTOO LONG!(MAX:15)\033[0m\033[0m') 
        continue 
       break 
      else: 
       print('\033[91m\033[1mNUMBERS ONLY!\033[0m\033[0m') 
    except EOFError: 
     print('\033[1m\n\nYOU CANCELED THE OPERATION!\033[0m') 
     time.sleep(1) 
     main_view() 
    except KeyboardInterrupt: 
     time.sleep(1) 
     os.system('clear') 
     exit(0) 

    return name, number 

全スクリプト:

import pickle, os, shutil, time 

window_width, window_height = shutil.get_terminal_size() 

def header(): 
    os.system('clear') 

    line = '=' * window_width 
    welcome = 'PHONEBOOK'.center(window_width) 
    print('\033[1m{0}\n{1}\n{0}\033[0m\n'.format(line, welcome)) 

def main_view(): 
    header() 
    data = None 
    try: 
     data = open('phonebook.data', 'rb') 
     phonebook = pickle.load(data) 
    except FileNotFoundError: 
     phonebook = {} 

    if phonebook: 
     print('\033[1m{0:20s}{1}\033[0m\n'.format('Name', 'Number')) 
     for name, number in sorted(phonebook.items()): 
      print('{0:20s}{1}'.format(name, number)) 
    else: 
     print('\033[1mTHERE ARE NO ENTRIES.\033[0m\n') 

    if data: 
     data.close() 

    footer('main', phonebook) 

def add_new(phonebook): 
    header() 

    name, number = get_contact() 

    phonebook.update({name : number}) 

    update_file(phonebook) 

    footer('addnew') 

def delete(phonebook): 
    header() 
    print('\033[1mENTER THE NAME OF THE CONTACT YOU WANT TO DELETE.\033[0m\n') 

    contact = get_input(': ') 
    found = isfound(phonebook, contact) 

    if found: 
     print('\033[1m\nDO YOU REALY WANT TO DELETE:\033[0m {0}({1})'\ 
      .format(contact, phonebook[contact])) 
     print('\033[1m(YES FOR CONFIRM ANYTHING ELSE FOR CANCEL)\033[0m') 

     confirm = get_input(': ') 
     print(confirm) 
     if confirm == 'YES': 
      del phonebook[contact] 

      update_file(phonebook) 

      footer('delete') 

     else: 
      time.sleep(1) 
      main_view() 

    else: 
     print('\nNOT FOUND') 
     time.sleep(1) 
     delete(phonebook) 

def modify(phonebook): 
    header() 
    print('\033[1mENTER THE NAME OF THE CONTACT YOU WANT TO MODIFY.\033[0m\n') 

    contact = get_input(': ') 
    found = isfound(phonebook, contact) 

    if found: 

     name, number = get_contact() 

     del phonebook[contact] 
     phonebook.update({name : number}) 

     update_file(phonebook) 

     footer('modify') 
    else: 
     print('\nNOT FOUND') 
     time.sleep(1) 
     modify(phonebook) 

def footer(view, phonebook=None): 
    if view == 'main': 
     text = '\033[1mADD NEW(a) MODIFY(m) DELETE(d) SEARCH(s)\ 
    EXIT(CTRL-D)\033[0m'.center(window_width) 
     print('\n',text) 

     try: 
      action = input(': ') 
     except (EOFError, KeyboardInterrupt): 
      time.sleep(1) 
      os.system('clear') 
      exit(0) 

     if action == 'a': 
      add_new(phonebook) 
     elif action == 'm': 
      modify(phonebook) 
     elif action == 'd': 
      delete(phonebook) 
     else: 
      print('\nINVALID!') 
      time.sleep(1) 
      main_view() 

    elif view == 'addnew' or view == 'modify' or view == 'delete': 
     print('\033[1m\nSUCCESSFUL!\033[0m') 
     time.sleep(1) 
     main_view() 

def get_contact(): 
    try: 
     while True: 
      name = input('\033[1m\nNAME: \033[0m') 
      if name.isalpha(): 
       if len(name) > 16: 
        print('\033[91m\033[1mTOO LONG!(MAX:15)\033[0m\033[0m') 
        continue 
       break 
      else: 
       print('\033[91m\033[1mALPHABETICAL CHARACTORS ONLY!\033[0m\ 
        \033[0m') 
     while True: 
      number = input('\033[1m\nNUMBER: \033[0m') 
      if number.isnumeric(): 
       if len(number) > 16: 
        print('\033[91m\033[1mTOO LONG!(MAX:15)\033[0m\033[0m') 
        continue 
       break 
      else: 
       print('\033[91m\033[1mNUMBERS ONLY!\033[0m\033[0m') 
    except EOFError: 
     print('\033[1m\n\nYOU CANCELED THE OPERATION!\033[0m') 
     time.sleep(1) 
     main_view() 
    except KeyboardInterrupt: 
     time.sleep(1) 
     os.system('clear') 
     exit(0) 

    return name, number 

def get_input(string): 
    try: 
     var = input(string) 
    except EOFError: 
     print('\033[1m\n\nYOU CANCELED THE OPERATION!\033[0m') 
     time.sleep(1) 
     main_view() 
    except KeyboardInterrupt: 
     time.sleep(1) 
     os.system('clear') 
     exit(0) 

    return var 

def isfound(phonebook, contact): 
    for name, number in phonebook.items(): 
     if contact == name: 
      return True 
    return False 

def update_file(phonebook): 
    data = open('phonebook.data', 'wb') 
    pickle.dump(phonebook, data) 
    data.close() 

if __name__ == '__main__': 
    main_view() 
+0

範囲(N)内のnに対して、あなたのサンプルコードを '' 'に減らすことができます:print( 'something')' ''?あなたの質問です - どのようにn回繰り返した後に同じ行に印刷することができますか? – wwii

+0

[1行で動的に印刷]可能な複製(http://stackoverflow.com/questions/3249524/print-in-one-line-dynamically) – wwii

+0

[前の出力を上書きする同じ行への出力?](http: /stackoverflow.com/q/4897359/2823755) – wwii

答えて

0

これはコンソールで動作します。

>>> for n in range(10): 
...  print('foo' + str(n), end = '\r') 
...  time.sleep(.2) 
... 
>>> 
関連する問題