天天看點

【Python 百練成鋼】使用Python實作密碼登入器

文章目錄

    • 前言
        • 實作思路(會不會python都可以看):
        • 介紹幾點代碼中可能會起疑惑的點
    • 源代碼

前言

使用Python實作一個黑視窗加密輸入字元串的插件。

可以将他封裝在函數内,調用函數傳回輸入的字元串。

具體效果如下:

【Python 百練成鋼】使用Python實作密碼登入器
可以實作回删。

實作思路(會不會python都可以看):

  • 接受輸入字元(接收的時候必須無回顯)可以使用getch()
  • 判斷接收的字元是不是回車(\n)【回車預示着輸入密碼結束】
  • 判斷字元是不是删除鍵(\b)

    【是\b的話需要回退光标,并删除原來位置上的資料,其他語言可以對該位置賦初值】

  • 其他字元列印*并将資料加入所要傳回的清單内

介紹幾點代碼中可能會起疑惑的點

  • getch

    :這個getch與c\c++中的還有些不一樣,這個得到的是一個位元組碼,需要解碼才能得到字元串。
  • \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)
           
【Python 百練成鋼】使用Python實作密碼登入器