如何让密码回显为星号
我想弄清楚如何提示输入密码,并让用户输入回显为星号( ********
)
所以最近,我开始创建一个可以使用Python中的套接字模块连接到远程服务器的项目。 它还没有完成,因为我正在使控制台用于连接到服务器。
我试图让其中一个用户被提示输入自己的用户名和密码登录窗口,虽然在输入时密码是我期待的星号来打印,如常见的密码输入(即 - Sekr3t被回显为:* * * * * *)。
经过几天的研究,我接近完成,但仍然有最后一个错误令我疯狂(我完全无法解决它)。 注 - 我知道有一个getpass模块可以用来取代这个,更容易,但没有echo'd不是我正在寻找。
这是我目前使用的密码登录代码,我无法弄清楚为什么它不会显示星号:
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
将光标移回到原来的位置,以便写入下一个*
。
我不知道如何确定何时键入退格键,但您可以轻松完成:只需在您调用x = msvcrt.getch()
之后添加诸如print repr(x)
x = msvcrt.getch()
启动你的程序并回退。
我认为这种方式非常简单和有效
import sys
import msvcrt
passwor = ''
while True:
x = msvcrt.getch()
if x == 'r':
break
sys.stdout.write('*')
passwor +=x
print 'n'+passwor
链接地址: http://www.djcxy.com/p/10837.html
上一篇: How to have password echoed as asterisks
下一篇: find all rectangular areas with certain properties in a matrix