Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在输入时检查字符';正在写什么?_Python_Python 3.x - Fatal编程技术网

Python 如何在输入时检查字符';正在写什么?

Python 如何在输入时检查字符';正在写什么?,python,python-3.x,Python,Python 3.x,所以我创建了一个密码管理器,我的代码有点接近这个, 我想知道是否有一种方法可以在写入字符串时(即在用户单击Enter之前)检查字符串中的字符,这样当用户输入大写字符时,我可以将表示“大写字符”的行的颜色更改为绿色,如果用户删除该字符,则返回到原始字符 from termcolor import colored from getpass import getpass import string def check_for_owasp_standards(password): upper

所以我创建了一个密码管理器,我的代码有点接近这个, 我想知道是否有一种方法可以在写入字符串时(即在用户单击Enter之前)检查字符串中的字符,这样当用户输入大写字符时,我可以将表示“大写字符”的行的颜色更改为绿色,如果用户删除该字符,则返回到原始字符

from termcolor import colored
from getpass import getpass

import string

def check_for_owasp_standards(password):
    uppercase_letters = string.ascii_uppercase
    lowercase_letters = string.ascii_lowercase
    digits = string.digits
    special_characters = "!@#$%^&*()-_"

    length_is_over_8 = False            
    contains_uppercase_letter = False
    contains_lowercase_letter = False
    contains_digit = False
    contains_special_character = False
    Checklist = []

    if len(password) >= 8 :     
        length_is_over_8 = True
    Checklist.append(length_is_over_8)

    for character in password:
        if character in uppercase_letters:
            contains_uppercase_letter = True
            break
    Checklist.append(contains_uppercase_letter)

    for character in password:
        if character in lowercase_letters:
            contains_lowercase_letter = True
            break
    Checklist.append(contains_lowercase_letter)

    for character in password:
        if character in digits:
            contains_digit = True
            break
    Checklist.append(contains_digit)

    for character in password:
        if character in special_characters:
            contains_special_character = True
            break
    Checklist.append(contains_special_character)

    if False in Checklist:
        return False
    else:
        return True

print(colored("According to OWASP password standards 2021 your master password must contain the following :", "magenta"))
print(colored("*An uppercase character", "magenta"))
print(colored("*A lowercase character", "magenta"))
print(colored("*A digit", "magenta"))
print(colored("*Length has to be 8 or more characters\n", "magenta"))

master_password = getpass(colored("Enter your master password : ", "blue"))
if not check_for_owasp_standards(master_password):
    print(colored("Password does not meet the standards, let's try again.\n", "yellow"))
else:
    print(colored("Master password saved successfully!", "green"))

我为你的问题创造了一个解决方案

这是一段视频,展示了它如何在我的控制台上工作>>。

您可以在这里获得完整的代码>>。

下面是解释: 您需要关闭控制台输出,然后捕获每个按键,最后再打开控制台输出

为此,您需要pynput.keyboard导入键的
,Listener
,其基本工作原理如下:

def on_释放(键):
打印(键)
如果输入[key.enter,key.esc]:
返回错误
使用侦听器(on_release=on_release)作为侦听器:
listener.join()
它基本上会打印每个按下的键,并在按Enter或Esc时停止工作。 Tp停止它可见。您将通过
os.system(“stty-echo”)
禁用它,并通过
os.system(“stty-echo”)

以下是我如何更改您的代码: 此方法类似于您的
检查\u owasp\u标准(密码)
,但将返回需要检查的每个标准的布尔值列表:

def检查标准(密码):
大写字母=string.ascii大写字母
小写字母=string.ascii小写字母
数字=字符串。数字
特殊字符=“!@$%^&*()-”
长度_为_除以_8=假
包含大写字母=False
包含小写字母=False
包含数字=假
包含特殊字符=False
检查表=[]
如果len(密码)>=8:
长度_为_除以_8=真
检查表.附加(长度为8以上)
对于密码中的字符:
如果字符以大写字母表示:
包含大写字母=真
打破
检查表.附加(包含大写字母)
对于密码中的字符:
如果字符以小写字母表示:
包含小写字母=真
打破
清单.附加(包含小写字母)
对于密码中的字符:
如果字符为数字:
包含数字=真
打破
检查表.附加(包含数字)
对于密码中的字符:
如果字符为特殊字符:
包含特殊字符=真
打破
清单.追加(包含特殊字符)
退货清单
下一个功能将此信息显示为彩色。绿色表示接受,红色表示不接受。显示更改的最简单方法是清除所有控制台中的内容,以覆盖之前写入控制台的行

def更新标准(密码):
#透明控制台
操作系统(“清除”)
#检查
标准=检查标准(密码)
打印(接受(“长度>=8”,标准[0]))
打印(接受(“包含大写字母”,标准[1]))
打印(接受(“包含小写字母”,标准[2]))
打印(接受(“包含数字”,标准[3]))
打印(接受(“包含特殊字符”,标准[4]))
使用

def accept(文本,accepted=False):
如果接受:
返回f'\033[32;1m{text}\033[0m'#绿色
其他:
返回f'\033[31;1m{text}\033[0m'#红色
主函数如下所示。它将首先将存储用户输入的全局变量重置为空字符串。然后显示密码的所有规则。然后向用户询问密码并关闭控制台中的显示。最后,它将返回

def getPassword():
尝试:
#将存储的输入重置为空字符串
全局用户输入
用户输入=“”
#显示密码规则
更新标准(“”)
#询问密码
打印('写入密码:')
#关闭显示输入
操作系统(“stty-echo”)
#收集钥匙直到进入/ESC
使用侦听器(on_release=on_release)作为侦听器:
listener.join()
输入()
除:
打印(traceback.print\u exc())
最后:
#打开“显示输入”
操作系统(“stty echo”)
最后一部分是编写按键侦听器:

def on_释放(键):
全局用户输入
#存储密钥
k=str(键)。替换('\'','')
如果len(k)==1:
用户输入+=k
#删除最后一个字符
如果key==key.backspace:
用户输入=用户输入[:-1]
更新标准(用户输入)
打印('Write your password:',''.join('*'表示范围内的u)(len(用户输入)))
#停止侦听器
如果输入[key.enter,key.esc]:
已完成(用户输入)
返回错误
当用户结束写入密码时,您可以使用它执行任何操作:

def完成(密码):
#执行您需要执行的操作,例如,将密码存储在某个位置
标准=检查标准(密码)
如果全部(标准):
打印('您的密码是:',密码)
其他:
打印('您的密码应符合所有规则')

据我所知,仅从命令行无法实现这一点,因为您只需在输入流中键入数据,一旦按Enter键,它就会传递到您的程序中,此时为时已晚。但是,使用a,您可以在每次按键时调用一个事件,您可以在其中检查密码的有效性,并将错误m信息出现/消失等。