如何让密码回显为星号

我想弄清楚如何提示input密码,并让用户input回显为星号( ********

所以最近,我接手了创build一个远程服务器的项目,该服务器可以使用Python中的套接字模块进行连接。 它还没有完成,因为我正在使控制台用于连接到服务器的过程。

我正在尝试做一个login窗口提示用户input他们的用户名和密码,虽然当input密码,我正在寻找星号打印,如普通密码input(即 – Sekr3t echo'd为:* * * * * *)。

经过几天的研究,我差不多完成了,但还有一个最后的错误让我疯狂(我完全无法解决它)。 注 – 我知道有一个getpass模块可以用来取代这个,更容易,但没有echo'd不是我正在寻找。

这里是我到目前为止的密码login代码,我不明白为什么它不回显星号:

 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 

>

如果您通过代码读取和/或通过类似IDLE的方式运行它,您可能会注意到,当用户退格时,存储的数据将被一个字符删除,但打印的星号不会被删除。 即 – Sekr3t + backspace = Sekr3,但* * * * * *留下echo'd。 任何帮助如何删除最后一个星号当退格键入将不胜感激。 还要注意,很多代码来自getpass模块。 我知道这不是一个很好的解释,可能不是那么伟大的代码,但我还在学习 – 请忍受我。

您应该可以通过写入字符\x08 \x08来擦除星号。 \x08将光标移回一个位置,空格将覆盖星号,然后最后一个\x08将光标移回到原来的位置,以便写入下一个*

我不知道如何确定什么时候input退格键,但是你可以轻松地做到这一点:在调用x = msvcrt.getch() ,添加一些类似print repr(x)东西,然后启动你的程序并回退。

我想这种方式非常简单有效

 import sys import msvcrt passwor = '' while True: x = msvcrt.getch() if x == '\r': break sys.stdout.write('*') passwor +=x print '\n'+passwor