小编典典

如何将密码回显为星号

python

我试图弄清楚如何提示输入密码,并让用户输入的内容以星号(********)回显

所以最近,我进行了一个创建远程服务器的项目,该服务器可以使用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模块。我知道这不是一个很好的解释,也许不是那么出色的代码,但我仍在学习中-
请多多包涵。


阅读 357

收藏
2020-12-20

共1个答案

小编典典

您应该能够通过写入字符来消除星号\x08 \x08。在\x08将光标移回一个位置,空间将覆盖星号,那么最后\x08就会再次移动光标,将它放在正确的位置写入下一个*

我不知道如何确定何时键入退格键,但是您可以轻松地做到这一点:只需print repr(x)在调用后添加x = msvcrt.getch(),然后启动程序并点击退格键即可。

2020-12-20