最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python?密碼驗(yàn)證(滑塊驗(yàn)證)

 更新時(shí)間:2022年03月01日 09:28:44   作者:Andy-wen  
滑塊密碼在很多登錄界面都可以看到,本文主要介紹了python?密碼驗(yàn)證(滑塊驗(yàn)證),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

題目描述:

(1)模擬登陸界面,判別用戶名和密碼,給出合適的提示,如果超過(guò)三次,鎖定輸入。用代替密碼;或者最新輸入顯示,前面的變成;安全性措施。
(2)同時(shí)添加如下圖的加強(qiáng)驗(yàn)證(京東)。
(3)在觸動(dòng)滾動(dòng)條時(shí)再出現(xiàn)空缺位置。

在這里插入圖片描述

拓展:

  • 增加注冊(cè)頁(yè)面,可供用戶注冊(cè)新用戶
  • 增加數(shù)字驗(yàn)證碼區(qū)別人機(jī)

解題思路/算法分析/問(wèn)題及解決

滑塊驗(yàn)證就是將滑塊的移動(dòng)和圖片小塊的移動(dòng)相綁定,在滑塊松開(kāi)時(shí)觸發(fā)相對(duì)應(yīng)的檢查函數(shù),為了有一定的容錯(cuò)率,設(shè)定滑塊的位置與設(shè)定的位置相差3個(gè)像素以內(nèi)即算驗(yàn)證成功。

  • 每次的位置隨機(jī)生成,同時(shí)隨即從14張事先準(zhǔn)備好的圖片中選取一張作為背景圖。
  • 圖片小塊和背景圖片分別放在兩個(gè)不同的QLabel容器中。
  • 每次刷新時(shí)將背景圖片的相應(yīng)位置摳出放于圖片小塊中,并將背景圖片的相應(yīng)部分置為白色以示區(qū)別。
  • 拓展:
  • 新增注冊(cè)頁(yè)部分就是點(diǎn)擊按鈕彈出注冊(cè)頁(yè)的對(duì)話框,可在里面輸入新用戶信息并保存到用戶信息字典中,隨后可用新注冊(cè)的用戶登錄。
  • 數(shù)字驗(yàn)證碼由4位數(shù)字0-9和字母a-z及A-Z組成,隨機(jī)在可行字符集中選取4個(gè)字符組成四位驗(yàn)證碼,然后自動(dòng)生成驗(yàn)證碼以圖片的方式呈現(xiàn)給用戶。

實(shí)驗(yàn)代碼

登錄主界面:
登錄驗(yàn)證:

def check_login_func(self):
        if not self.validate_line.text():
            QMessageBox.warning(self, "警告", "還未輸入驗(yàn)證碼")
            return
        validate_slide = Validate_page()
        r = validate_slide.exec_()
        if not r:
            return
        if self.validate.upper() == self.validate_line.text().upper():
            if USER_PWD.get(self.user_line.text()) == self.pwd_line.text():
                QMessageBox.information(self, 'Information', 'Log in Successfully!')
                self.nums = 0
                self.refresh()
                # self.close()
                # self.STU.exec()
            else:
                QMessageBox.critical(self, 'Wrong', 'Wrong Username or Password!')
                self.nums = self.nums + 1
                if self.nums == 3:
                    QMessageBox.critical(self, "wrong", "密碼輸錯(cuò)次數(shù)已達(dá)三次!")
                    self.close()

            self.user_line.clear()
            self.pwd_line.clear()
            self.validate_line.clear()
        else:
            QMessageBox.critical(self, "wrong", "驗(yàn)證碼輸入有誤!")
            self.refresh()
            self.validate_line.clear()

自動(dòng)生成驗(yàn)證碼圖片:

def get_chars():
        """生成給定長(zhǎng)度的字符串,返回列表格式"""

        return random.sample(chars, length)

    def create_lines():
        """繪制干擾線"""

        line_num = random.randint(*n_line)  # 干擾線條數(shù)

        for i in range(line_num):
            # 起始點(diǎn)
            begin = (random.randint(0, size[0]), random.randint(0, size[1]))
            # 結(jié)束點(diǎn)
            end = (random.randint(0, size[0]), random.randint(0, size[1]))
            draw.line([begin, end], fill=(0, 0, 0))

    def create_points():
        """繪制干擾點(diǎn)"""

        chance = min(100, max(0, int(point_chance)))  # 大小限制在[0, 100]

        for w in range(width):
            for h in range(height):
                tmp = random.randint(0, 100)
                if tmp > 100 - chance:
                    draw.point((w, h), fill=(0, 0, 0))

    def create_strs():
        """繪制驗(yàn)證碼字符"""

        c_chars = get_chars()
        strs = ' %s ' % ' '.join(c_chars)  # 每個(gè)字符前后以空格隔開(kāi)

        font = ImageFont.truetype(font_type, font_size)
        font_width, font_height = font.getsize(strs)

        draw.text(((width - font_width) / 3, (height - font_height) / 3),
                  strs, font=font, fill=fg_color)

        return ''.join(c_chars)

    if draw_lines:
        create_lines()
    if draw_points:
        create_points()
    strs = create_strs()

    # 圖形扭曲參數(shù)
    params = [1 - float(random.randint(1, 2)) / 100,
              0,
              0,
              0,
              1 - float(random.randint(1, 10)) / 100,
              float(random.randint(1, 2)) / 500,
              0.001,
              float(random.randint(1, 2)) / 500
              ]
    img = img.transform(size, Image.PERSPECTIVE, params)  # 創(chuàng)建扭曲

    img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)  # 濾鏡,邊界加強(qiáng)(閾值更大)

    mstream = io.BytesIO()
    img.save(mstream, img_type)

    if save_img:
        img.save("validate.jpg", img_type)

    return mstream, strs

注冊(cè)界面部分:
頁(yè)面初始化:

def __init__(self):
        super(SigninPage, self).__init__()
        self.signin_user_label = QLabel('Username:', self)
        self.signin_pwd_label = QLabel('Password:', self)
        self.signin_pwd2_label = QLabel('Password:', self)
        self.signin_user_line = QLineEdit(self)
        self.signin_pwd_line = QLineEdit(self)
        self.signin_pwd2_line = QLineEdit(self)
        self.signin_button = QPushButton('Sign in', self)

        self.user_h_layout = QHBoxLayout()
        self.pwd_h_layout = QHBoxLayout()
        self.pwd2_h_layout = QHBoxLayout()
        self.all_v_layout = QVBoxLayout()

        self.lineedit_init()
        self.pushbutton_init()
        self.layout_init()

    def layout_init(self):
        self.user_h_layout.addWidget(self.signin_user_label)
        self.user_h_layout.addWidget(self.signin_user_line)
        self.pwd_h_layout.addWidget(self.signin_pwd_label)
        self.pwd_h_layout.addWidget(self.signin_pwd_line)
        self.pwd2_h_layout.addWidget(self.signin_pwd2_label)
        self.pwd2_h_layout.addWidget(self.signin_pwd2_line)

        self.all_v_layout.addLayout(self.user_h_layout)
        self.all_v_layout.addLayout(self.pwd_h_layout)
        self.all_v_layout.addLayout(self.pwd2_h_layout)
        self.all_v_layout.addWidget(self.signin_button)

        self.setLayout(self.all_v_layout)

    def lineedit_init(self):
        self.signin_user_line.setPlaceholderText("username")
        self.signin_pwd_line.setPlaceholderText("password")
        self.signin_pwd2_line.setPlaceholderText("password again")

        self.signin_pwd_line.setEchoMode(QLineEdit.Password)
        self.signin_pwd2_line.setEchoMode(QLineEdit.Password)

        self.signin_user_line.textChanged.connect(self.check_input_func)
        self.signin_pwd_line.textChanged.connect(self.check_input_func)
        self.signin_pwd2_line.textChanged.connect(self.check_input_func)

注冊(cè)檢驗(yàn)部分:

def check_signin_func(self):
        if self.signin_pwd_line.text() != self.signin_pwd2_line.text():
            QMessageBox.critical(self, 'Wrong', 'Two Passwords Typed Are Not Same!')
        elif self.signin_user_line.text() not in USER_PWD:
            USER_PWD[self.signin_user_line.text()] = self.signin_pwd_line.text()
            QMessageBox.information(self, 'Information', 'Register Successfully')
            self.close()
        else:
            QMessageBox.critical(self, 'Wrong', 'This Username Has Been Registered!')

        self.signin_user_line.clear()
        self.signin_pwd_line.clear()
        self.signin_pwd2_line.clear()

滑塊驗(yàn)證部分:

class Validate_page(QDialog):
    def __init__(self):
        super(Validate_page, self).__init__()
        self.resize(600, 500)
        self.setWindowTitle("拖動(dòng)滑塊驗(yàn)證")
        self.initUI()
        self.Widget_init()
        self.refresh()
        # self.show()

    def initUI(self):
        # 初始化相關(guān)控件位置
        self.lb_bg = QLabel(self)
        self.lb_sl = QLabel(self)

        self.lb_bg.setStyleSheet("border: 2px solid red")
        # self.lb_sl.setStyleSheet("border: 2px solid blue")
        self.lb_bg.setGeometry(100, 100, 400, 200)

        self.lb_wz = QLabel(self)
        # self.lb_wz.setStyleSheet("border: 2px solid green")

        self.refresh()

        self.button = QPushButton("取消", self)
        self.button.setGeometry(400, 430, 100, 50)

        self.slider = QSlider(Qt.Horizontal, self)
        self.slider.setGeometry(100, 350, 400, 50)

    def Widget_init(self):
        # 初始化相關(guān)組件的信號(hào)連接
        self.slider.setMinimum(0)
        self.slider.setMaximum(360)
        self.slider.valueChanged.connect(self.slide)
        self.slider.sliderReleased.connect(self.check)
        self.button.clicked.connect(self.cancel)

    def slide(self, value):
        self.lb_sl.move(100 + value, self.answer_y)  # 將滑塊與圖片小塊綁定
        # print(value)

    def refresh(self):
        import random
        # 隨機(jī)生成驗(yàn)證區(qū)域
        self.answer_x = random.randint(100, 460)
        self.answer_y = random.randint(100, 260)
        pic = random.randint(0, 14)

        self.lb_sl.setGeometry(100, self.answer_y, 40, 40)
        self.lb_wz.setGeometry(self.answer_x, self.answer_y, 40, 40)
        img = cv2.imread(f"pic/{pic}.jpeg")  # 讀取背景圖片
        img = cv2.resize(img, (400, 200))
        x = self.answer_x - 100
        y = self.answer_y - 100
        img1 = copy.copy(img[y:y + 40, x:x + 40])  # 扣40*40的圖片小塊
        img[y:y + 40, x:x + 40] = 255  # 將被扣區(qū)域置為白色
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)

        qt_img = QImage(img.data, 400, 200, QImage.Format_RGB888)
        qt_img1 = QImage(img1.data, 40, 40, QImage.Format_RGB888)
        self.lb_bg.setPixmap(QPixmap.fromImage(qt_img))
        self.lb_sl.setPixmap(QPixmap.fromImage(qt_img1))

    def check(self):  # 檢驗(yàn)滑動(dòng)驗(yàn)證是否成功
        # 獲取設(shè)定區(qū)域坐標(biāo)
        x = self.lb_sl.pos().x()
        y = self.lb_sl.pos().y()
        print(f"({x},{y})")
        if abs(x - self.answer_x) <= 3:  # 容錯(cuò)為3px
            QMessageBox.information(self, "恭喜", "驗(yàn)證成功")
            self.done(1)
        else:
            QMessageBox.critical(self, "錯(cuò)誤", "驗(yàn)證失敗")
            self.slider.setValue(0)
            self.refresh()

    def cancel(self):
        self.done(0)  # 點(diǎn)擊取消滑動(dòng)驗(yàn)證

運(yùn)行結(jié)果

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

全部背景圖片:

在這里插入圖片描述

注冊(cè)界面:

在這里插入圖片描述

完整代碼

到此這篇關(guān)于python 密碼驗(yàn)證(滑塊驗(yàn)證)的文章就介紹到這了,更多相關(guān)python 密碼驗(yàn)證(滑塊驗(yàn)證)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python驗(yàn)證碼圖片處理(二值化)

    python驗(yàn)證碼圖片處理(二值化)

    這篇文章主要介紹了python驗(yàn)證碼圖片處理(二值化),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • python linecache讀取行更新的實(shí)現(xiàn)

    python linecache讀取行更新的實(shí)現(xiàn)

    本文主要介紹了python linecache讀取行更新的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • python中遍歷文件的3個(gè)方法

    python中遍歷文件的3個(gè)方法

    這篇文章主要介紹了python中遍歷文件的3個(gè)方法,本文分別使用os.path.walk()、os.walk()、os.listdir()來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2014-09-09
  • Spectral?clustering譜聚類算法的實(shí)現(xiàn)代碼

    Spectral?clustering譜聚類算法的實(shí)現(xiàn)代碼

    譜聚類是從圖論中演化出來(lái)的算法,它的主要思想是把所有的數(shù)據(jù)看做空間中的點(diǎn),這些點(diǎn)之間可以用邊連接起來(lái),今天通過(guò)本文給大家介紹Spectral?clustering譜聚類算法的實(shí)現(xiàn),感興趣的朋友一起看看吧
    2022-04-04
  • Python中的defaultdict與__missing__()使用介紹

    Python中的defaultdict與__missing__()使用介紹

    下面這篇文章主要給大家介紹了關(guān)于Python中defaultdict使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-02-02
  • python散點(diǎn)圖雙軸設(shè)置坐標(biāo)軸刻度的實(shí)現(xiàn)

    python散點(diǎn)圖雙軸設(shè)置坐標(biāo)軸刻度的實(shí)現(xiàn)

    散點(diǎn)圖是一種常用的圖表類型,可以用來(lái)展示兩個(gè)變量之間的關(guān)系,本文主要介紹了python散點(diǎn)圖雙軸設(shè)置坐標(biāo)軸刻度的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • python+mediapipe+opencv實(shí)現(xiàn)手部關(guān)鍵點(diǎn)檢測(cè)功能(手勢(shì)識(shí)別)

    python+mediapipe+opencv實(shí)現(xiàn)手部關(guān)鍵點(diǎn)檢測(cè)功能(手勢(shì)識(shí)別)

    這篇文章主要介紹了python+mediapipe+opencv實(shí)現(xiàn)手部關(guān)鍵點(diǎn)檢測(cè)功能(手勢(shì)識(shí)別),本文僅僅簡(jiǎn)單介紹了mediapipe的使用,而mediapipe提供了大量關(guān)于圖像識(shí)別等的方法,需要的朋友可以參考下
    2022-01-01
  • 基于Linux系統(tǒng)中python matplotlib畫(huà)圖的中文顯示問(wèn)題的解決方法

    基于Linux系統(tǒng)中python matplotlib畫(huà)圖的中文顯示問(wèn)題的解決方法

    下面小編就為大家?guī)?lái)一篇基于Linux系統(tǒng)中python matplotlib畫(huà)圖的中文顯示問(wèn)題的解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • python3實(shí)現(xiàn)小球轉(zhuǎn)動(dòng)抽獎(jiǎng)小游戲

    python3實(shí)現(xiàn)小球轉(zhuǎn)動(dòng)抽獎(jiǎng)小游戲

    這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)小球轉(zhuǎn)動(dòng)抽獎(jiǎng)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Python 元組(Tuple)操作詳解

    Python 元組(Tuple)操作詳解

    Python的元組與列表類似,不同之處在于元組的元素不能修改,元組使用小括號(hào),列表使用方括號(hào),元組創(chuàng)建很簡(jiǎn)單,只需要在括號(hào)中添加元素,并使用逗號(hào)隔開(kāi)即可
    2014-03-03

最新評(píng)論

北辰区| 崇礼县| 泗洪县| 鲁甸县| 龙泉市| 保靖县| 汉沽区| 商洛市| 额敏县| 遂溪县| 乳源| 定襄县| 常熟市| 普陀区| 西林县| 长宁县| 财经| 新和县| 延吉市| 福州市| 黎城县| 高邑县| 高青县| 芦溪县| 喀喇| 大英县| 邳州市| 青海省| 恩施市| 抚宁县| 成都市| 乌拉特中旗| 乌鲁木齐市| 砚山县| 朝阳市| 华宁县| 永嘉县| 姚安县| 灵寿县| 佳木斯市| 临高县|