Mol*_*nar 8 python passwords msvcrt getch echo
我试图弄清楚如何提示输入密码,并将用户输入回显为星号(********)
最近,我开始创建一个可以连接到使用Python中的套接字模块的远程服务器的项目.它还没有完成,因为我正在使控制台用于连接服务器.
我正在尝试创建一个登录窗口,提示用户输入用户名和密码,但输入密码时我正在寻找要打印的星号,就像常见的密码输入一样(即 - Sekr3t被回复为:******).
经过几天的研究,我差不多完成了仍然有一个最后的错误,让我疯了(我完全无法解决它).注意 - 我知道有一个getpass模块可以用来替换它,更容易,但没有回声不是我正在寻找的.
这是我到目前为止的密码登录代码,我无法弄清楚为什么它不会回响星号:
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
Run Code Online (Sandbox Code Playgroud)
>
如果您通过代码阅读和/或通过IDLE之类的内容运行它,您可能会注意到当用户后退空间时,存储的数据被一个字符擦除,但打印的星号不是.ie - Sekr3t + backspace = Sekr3,但是******留下了回音.任何关于如何在输入退格时擦除最后一个星号的帮助将不胜感激.另请注意,很多此代码来自getpass模块.我知道这不是一个很好的解释,可能不是那么好的代码,但我还在学习 - 请耐心等待.
您应该能够通过书写字符来擦除星号\x08 \x08。会将\x08光标移回一个位置,空格将覆盖星号,然后最后一个\x08将再次将光标移回,将其放在正确的位置以写入下一个*。
我不知道如何确定何时键入退格键,但您可以轻松做到这一点:只需print repr(x)在调用后添加类似的内容x = msvcrt.getch(),然后启动程序并按退格键。