我试图弄清楚如何提示输入密码,并让用户输入的内容以星号(********)回显
********
所以最近,我进行了一个创建远程服务器的项目,该服务器可以使用Python中的套接字模块连接到该服务器。尚未完成,因为我正在制作用于连接服务器的控制台。
我正在尝试创建一个登录窗口,提示用户输入用户名和密码,尽管输入密码后,我正在寻找要打印的星号,例如普通密码输入(即-Sekr3t回显为: * * )。
经过几天的研究,我几乎完成了,但是仍然有最后一个错误使我发疯(我完全无法解决)。注意- 我知道有一个getpass模块可以用来替换它,更加容易,但是没有任何echo并不是我要找的东西。
这是我到目前为止拥有的密码登录代码,我无法弄清为什么它不回显星号:
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 +退格键= Sekr3,但是 * * 被回显。我们非常感谢您在输入退格键后如何删除最后一个星号的任何帮助。还要注意,许多代码来自getpass模块。我知道这不是一个很好的解释,也许不是那么出色的代码,但我仍在学习中- 请多多包涵。
您应该能够通过写入字符来消除星号\x08 \x08。在\x08将光标移回一个位置,空间将覆盖星号,那么最后\x08就会再次移动光标,将它放在正确的位置写入下一个*。
\x08 \x08
\x08
*
我不知道如何确定何时键入退格键,但是您可以轻松地做到这一点:只需print repr(x)在调用后添加x = msvcrt.getch(),然后启动程序并点击退格键即可。
print repr(x)
x = msvcrt.getch()