如何将密码回显为星号

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模块.我知道这不是一个很好的解释,可能不是那么好的代码,但我还在学习 - 请耐心等待.

Dav*_*ver 4

您应该能够通过书写字符来擦除星号\x08 \x08。会将\x08光标移回一个位置,空格将覆盖星号,然后最后一个\x08将再次将光标移回,将其放在正确的位置以写入下一个*

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