文章目錄
-
- 前言
-
-
- 實作思路(會不會python都可以看):
- 介紹幾點代碼中可能會起疑惑的點
-
- 源代碼
前言
使用Python實作一個黑視窗加密輸入字元串的插件。
可以将他封裝在函數内,調用函數傳回輸入的字元串。
具體效果如下:
可以實作回删。![]()
【Python 百練成鋼】使用Python實作密碼登入器 實作思路(會不會python都可以看):
- 接受輸入字元(接收的時候必須無回顯)可以使用getch()
- 判斷接收的字元是不是回車(\n)【回車預示着輸入密碼結束】
判斷字元是不是删除鍵(\b)
【是\b的話需要回退光标,并删除原來位置上的資料,其他語言可以對該位置賦初值】
- 其他字元列印*并将資料加入所要傳回的清單内
介紹幾點代碼中可能會起疑惑的點
:這個getch與c\c++中的還有些不一樣,這個得到的是一個位元組碼,需要解碼才能得到字元串。
getch
\b \b
:都知道\b是ASCII表中的倒退鍵他對應的值為8,是以在輸入的時候使用ord()進行了轉換
\b是倒退,那麼\b \b就是使用空格将原來的字元覆寫後再将光标移到原來的位置。
sys.stdout.flush()
:如果不加這一句話輸入密碼的時候隻有按Enter鍵才會顯示出來,也就是沒
有辦法同步顯示*或者删除*,加上這句的意思就是重新整理緩沖區。具體為什麼我也不是很清楚,之前寫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)