如何让密码回显为星号

我想弄清楚如何提示输入密码,并让用户输入回显为星号( ********

所以最近,我开始创建一个可以使用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