前言
使用Python实现一个黑窗口加密输入字符串的插件。
可以将他封装在函数内,调用函数返回输入的字符串。
具体效果如下:
可以实现回删。
实现思路(会不会python都可以看):
接受输入字符(接收的时候必须无回显)可以使用getch()
判断接收的字符是不是回车(\n)【回车预示着输入密码结束】
判断字符是不是删除键(\b)
【是\b的话需要回退光标,并删除原来位置上的数据,其他语言可以对该位置赋初值】
其他字符打印*并将数据加入所要返回的列表内
介绍几点代码中可能会起疑惑的点
getch :这个getch与c\c++中的还有些不一样,这个得到的是一个字节码,需要解码才能得到字符串。
\b \b :都知道\b是ASCII表中的退格键他对应的值为8,所以在输入的时候使用ord()进行了转换
\b是退格,那么\b \b就是使用空格将原来的字符覆盖后再将光标移到原来的位置。
sys.stdout.flush() :如果不加这一句话输入密码的时候只有按回车键才会显示出来,也就是没
有办法同步显示*或者删除*,加上这句的意思就是刷新缓冲区。具体为什么我也不是很清楚,之前写c++小项目的时候偶尔会有这种情况,刷新一下缓冲区就好了,所以在碰到这种问题的时候我首先想到了刷新缓冲区。
其他的应该大家都会了,毕竟会python的多少会点逻辑的处理。(代码放在下方了)
源代码
from msvcrt import getch import sys sys.stdout.write("请输入您的密码:") sys.stdout.flush() passwd=[] while True: n=getch().decode() if ord(n)==13: break else: if ord(n)==8 and len(passwd)!=0: print('\b \b',end="") passwd.pop() elif ord(n)==8 and len(passwd)==0: pass else: print('*',end="") passwd.append(n) sys.stdout.flush() print() print(passwd)