8

我正在尝试创建一个登录窗口,提示用户输入他们的用户名和密码,尽管输入密码时我正在寻找要打印的星号,例如常见的密码输入(即 - Sekr3t 被回显为:* * * * * *)。

这是我到目前为止的代码,我不知道为什么它不回显星号:

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

任何帮助,将不胜感激。

4

3 回答 3

4

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

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

于 2012-06-12T06:10:41.343 回答
0

我认为这种方式非常简单有效

import sys
import msvcrt

passwor = ''
while True:
    x = msvcrt.getch()
    if x == '\r':
        break
    sys.stdout.write('*')
    passwor +=x

print '\n'+passwor
于 2017-04-30T07:26:34.753 回答
0

这些年来我都这样做了……在壳牌……

有关进一步改进它的想法...... https://antofthy.gitlab.io/info/crypto/passwd_askpass_stars.txt

具有许多花里胡哨且仍在不断发展的最终脚本 https://antofthy.gitlab.io/software/#askpass_stars

请注意,您真的不应该将它直接包含在您的程序中,而是将其作为密码助手,以便许多程序可以使用它。EG:使用环境变量(如 TTY_ASKPASS)或其他配置设置程序。

https://stackoverflow.com/a/67327327/701532

通过这样做,您不会将用户限制为您提供的内容,而是允许从其他地方获取密码。“ssh”甚至“sudo”也这样做。

于 2021-04-30T02:42:56.330 回答