How to have password echoed as asterisks

10,282

You should be able to erase an asterisk by writing the characters \x08 \x08. The \x08 will move the cursor back one position, the space will overwrite the asterisk, then the last \x08 will move the cursor back again, putting it in the correct position to write the next *.

I don't know off the top of my head how to determine when a backspace is typed, but you can do that easily: just add something like print repr(x) after you've called x = msvcrt.getch(), then start your program and hit backspace.

Share:
10,282
Admin
Author by

Admin

Updated on August 02, 2022

Comments

  • Admin
    Admin over 1 year

    I'm trying make a login window where a user is prompted to enter their Username and Password, although when the password is entered I am looking for asterisks to be printed, like common password entry (i.e. - Sekr3t is echo'd as: * * * * * *).

    Here's the code I have so far, and I can't figure out why it doesn't echo asterisks:

    import msvcrt
    import sys
    
    def login(prompt = '> '):
       write = sys.stdout.write
       
       for x in prompt:
           msvcrt.putch(x)
       passw = ""
       
       while 1:
           x = msvcrt.getch()
           if x == '\r' or x == '\n':
               break
           if x == '\b':
               # position of my error
               passw = passw[:-1]
           else:
               write('*')
               passw = passw + x
       msvcrt.putch('\r')
       msvcrt.putch('\n')
       return passw
    

    Any help would be appreciated.