wxPython之模拟带有验证码的登录

简介:   带有验证码的登录,是我们在上网时经常遇到的场景。本文将利用Python的wxPython模块来模拟带有验证码的登录。其GUI界面如下:     首先,我们需要产生验证码图片,图片的文字从‘A-Z,a-z,0-9’中随机产生4个,这可以利用Python的Pygame模块来完成。

  带有验证码的登录,是我们在上网时经常遇到的场景。本文将利用Python的wxPython模块来模拟带有验证码的登录。其GUI界面如下:
  这里写图片描述
  首先,我们需要产生验证码图片,图片的文字从‘A-Z,a-z,0-9’中随机产生4个,这可以利用Python的Pygame模块来完成。其函数如下:

    #产生图片验证码的图像,保存在本地电脑
    def generate_picture(self):
        #pygame初始化
        pygame.init()
        #设置字体和字号
        font = pygame.font.SysFont('consolas', 64)
        #产生字母及数字列表,并重组,取其前四个作为图片验证码的文字
        chr_num_lst = list(itertools.chain([chr(ord('A')+_) for _ in range(26)],\
                                       [chr(ord('a')+_) for _ in range(26)],\
                                       [str(_) for _ in range(10)]))

        random.shuffle(chr_num_lst)
        self.val_text = chr_num_lst[0]+chr_num_lst[1]+chr_num_lst[2]+chr_num_lst[3]
        #渲染图片,设置背景颜色和字体样式,前面的颜色是字体颜色
        ftext = font.render(self.val_text, True, (0, 0, 255),(255,0,0))
        #保存图片
        pygame.image.save(ftext, r"%s/val.png"%os.getcwd())#图片保存地址

  接着,我们需要利用wxPython模块进行GUI设计,界面设计的代码如下:

class Example(wx.Frame): 
    def __init__(self, parent, title):
        #继承父类wx.Frame的初始化方法,并设置窗口大小为320*220
        super(Example, self).__init__(parent, title = title, size=(320, 220)) 
        self.InitUI() 
        self.Centre() 
        self.Show()

def InitUI(self):
        #产生验证码图片
        self.generate_picture()

        #利用wxpython的GridBagSizer()进行页面布局
        panel = wx.Panel(self) 
        sizer = wx.GridBagSizer(10, 20) #列间隔为10,行间隔为20

        #添加账号字段,并加入页面布局,为第一行,第一列
        text = wx.StaticText(panel, label="账号") 
        sizer.Add(text, pos = (0, 0), flag=wx.ALL, border=5)

        #添加文本框字段,并加入页面布局,为第一行,第2,3列
        self.tc = wx.TextCtrl(panel) 
        sizer.Add(self.tc, pos=(0, 1), span=(1,2), flag=wx.EXPAND|wx.ALL, border=5) 

        #添加密码字段,并加入页面布局,为第二行,第一列
        text1 = wx.StaticText(panel, label="密码") 
        sizer.Add(text1, pos=(1,0), flag=wx.ALL, border=5) 

        #添加文本框字段,以星号掩盖,并加入页面布局,为第二行,第2,3列
        tc1 = wx.TextCtrl(panel, style=wx.TE_PASSWORD) 
        sizer.Add(tc1, pos=(1,1), span=(1,2), flag=wx.EXPAND|wx.ALL, border=5) 

        #添加验证码字段,并加入页面布局,为第三行,第一列
        text2 = wx.StaticText(panel, label = "验证码") 
        sizer.Add(text2, pos=(2, 0), flag = wx.ALL, border=5)

        #添加文本框字段,并加入页面布局,为第三行,第2列
        self.tc2 = wx.TextCtrl(panel)
        sizer.Add(self.tc2, pos=(2,1), flag=wx.ALL, border=5)

        #添加验证码图片,并加入页面布局,为第三行,第3列
        image = wx.Image(r'%s/val.png'%os.getcwd(), wx.BITMAP_TYPE_PNG).Rescale(80,25).ConvertToBitmap() #获取图片,转化为Bitmap形式
        self.bmp= wx.StaticBitmap(panel, -1, image) #转化为wx.StaticBitmap()形式
        sizer.Add(self.bmp, pos=(2,2), flag=wx.ALL, border=5)

        #添加登录按钮,并加入页面布局,为第四行,第2列
        btn = wx.Button(panel, -1, "登录")
        sizer.Add(btn, pos=(3,1), flag=wx.ALL, border=5)

        #为登录按钮绑定login_process事件
        self.Bind(wx.EVT_BUTTON, self.login_process, btn)
        #将Panmel适应GridBagSizer()放置
        panel.SetSizerAndFit(sizer)

  最后,我们需要为“登录”按钮绑定事件,当验证码输入正确时,弹出消息框“登录成功!”,当验证码输入错误时,弹出消息框“登录失败!请重试!”同时,验证码的图片会改变。其函数定义如下:

#事件处理
    def login_process(self, event):
        self.input_val = self.tc2.GetValue()#获取验证码文本框的输入文字

        #判断验证码文本框的输入文字是否等于验证码图片上的文字(不计大小写),并弹出消息框
        if self.input_val.lower() == self.val_text.lower(): 
            wx.MessageBox("登录成功!\n欢迎您,%s!"%self.tc.GetValue(),'登录结果',wx.OK|wx.ICON_INFORMATION)
        else:
            wx.MessageBox("登录失败!请重试!",'登录结果',wx.OK|wx.ICON_INFORMATION)
            self.tc2.SetValue("") #将验证码文本框清空
            self.generate_picture() #重新产生一张验证码图片
            #获取新产生的验证码图片,转化为Bitmap形式
            image = wx.Image(r'%s/val.png'%os.getcwd(), wx.BITMAP_TYPE_PNG).Rescale(80,25).ConvertToBitmap()
            #更新GridBagSizer()的self.bmp
            self.bmp.SetBitmap(wx.BitmapFromImage(image))

  当GUI设计完成后,进行测试,需要对不同的情况进行验证,图片如下:
  这里写图片描述
  这里写图片描述
  这里写图片描述
  这里写图片描述
  这里写图片描述
  这里写图片描述
  完整的Python代码如下:

#载入必要的模块
import wx
import os
import pygame
from pygame.locals import *
import itertools
import random 

#创建类
class Example(wx.Frame): 
    def __init__(self, parent, title):
        #继承父类wx.Frame的初始化方法,并设置窗口大小为320*220
        super(Example, self).__init__(parent, title = title, size=(320, 220)) 
        self.InitUI() 
        self.Centre() 
        self.Show()

    #产生图片验证码的图像,保存在本地电脑
    def generate_picture(self):
        #pygame初始化
        pygame.init()
        #设置字体和字号
        font = pygame.font.SysFont('consolas', 64)
        #产生字母及数字列表,并重组,取其前四个作为图片验证码的文字
        chr_num_lst = list(itertools.chain([chr(ord('A')+_) for _ in range(26)],\
                                       [chr(ord('a')+_) for _ in range(26)],\
                                       [str(_) for _ in range(10)]))

        random.shuffle(chr_num_lst)
        self.val_text = chr_num_lst[0]+chr_num_lst[1]+chr_num_lst[2]+chr_num_lst[3]
        #渲染图片,设置背景颜色和字体样式,前面的颜色是字体颜色
        ftext = font.render(self.val_text, True, (0, 0, 255),(255,0,0))
        #保存图片
        pygame.image.save(ftext, r"%s/val.png"%os.getcwd())#图片保存地址

    def InitUI(self):
        #产生验证码图片
        self.generate_picture()

        #利用wxpython的GridBagSizer()进行页面布局
        panel = wx.Panel(self) 
        sizer = wx.GridBagSizer(10, 20) #列间隔为10,行间隔为20

        #添加账号字段,并加入页面布局,为第一行,第一列
        text = wx.StaticText(panel, label="账号") 
        sizer.Add(text, pos = (0, 0), flag=wx.ALL, border=5)

        #添加文本框字段,并加入页面布局,为第一行,第2,3列
        self.tc = wx.TextCtrl(panel) 
        sizer.Add(self.tc, pos=(0, 1), span=(1,2), flag=wx.EXPAND|wx.ALL, border=5) 

        #添加密码字段,并加入页面布局,为第二行,第一列
        text1 = wx.StaticText(panel, label="密码") 
        sizer.Add(text1, pos=(1,0), flag=wx.ALL, border=5) 

        #添加文本框字段,以星号掩盖,并加入页面布局,为第二行,第2,3列
        tc1 = wx.TextCtrl(panel, style=wx.TE_PASSWORD) 
        sizer.Add(tc1, pos=(1,1), span=(1,2), flag=wx.EXPAND|wx.ALL, border=5) 

        #添加验证码字段,并加入页面布局,为第三行,第一列
        text2 = wx.StaticText(panel, label = "验证码") 
        sizer.Add(text2, pos=(2, 0), flag = wx.ALL, border=5)

        #添加文本框字段,并加入页面布局,为第三行,第2列
        self.tc2 = wx.TextCtrl(panel)
        sizer.Add(self.tc2, pos=(2,1), flag=wx.ALL, border=5)

        #添加验证码图片,并加入页面布局,为第三行,第3列
        image = wx.Image(r'%s/val.png'%os.getcwd(), wx.BITMAP_TYPE_PNG).Rescale(80,25).ConvertToBitmap() #获取图片,转化为Bitmap形式
        self.bmp= wx.StaticBitmap(panel, -1, image) #转化为wx.StaticBitmap()形式
        sizer.Add(self.bmp, pos=(2,2), flag=wx.ALL, border=5)

        #添加登录按钮,并加入页面布局,为第四行,第2列
        btn = wx.Button(panel, -1, "登录")
        sizer.Add(btn, pos=(3,1), flag=wx.ALL, border=5)

        #为登录按钮绑定login_process事件
        self.Bind(wx.EVT_BUTTON, self.login_process, btn)
        #将Panmel适应GridBagSizer()放置
        panel.SetSizerAndFit(sizer)

    #事件处理
    def login_process(self, event):
        self.input_val = self.tc2.GetValue()#获取验证码文本框的输入文字

        #判断验证码文本框的输入文字是否等于验证码图片上的文字(不计大小写),并弹出消息框
        if self.input_val.lower() == self.val_text.lower(): 
            wx.MessageBox("登录成功!\n欢迎您,%s!"%self.tc.GetValue(),'登录结果',wx.OK|wx.ICON_INFORMATION)
        else:
            wx.MessageBox("登录失败!请重试!",'登录结果',wx.OK|wx.ICON_INFORMATION)
            self.tc2.SetValue("") #将验证码文本框清空
            self.generate_picture() #重新产生一张验证码图片
            #获取新产生的验证码图片,转化为Bitmap形式
            image = wx.Image(r'%s/val.png'%os.getcwd(), wx.BITMAP_TYPE_PNG).Rescale(80,25).ConvertToBitmap()
            #更新GridBagSizer()的self.bmp
            self.bmp.SetBitmap(wx.BitmapFromImage(image))

#主函数                   
def main():           
    app = wx.App() 
    Example(None, title = '图片验证GUI') 
    app.MainLoop()

main()



本次分享到此结束,欢迎大家交流与批评~~

目录
相关文章
|
小程序 数据安全/隐私保护 开发者
【已解决】开发者扫码登录提示“需要验证小程序密码”
开发者扫码登录提示“需要验证小程序密码”
472 0
【已解决】开发者扫码登录提示“需要验证小程序密码”
|
10月前
|
数据安全/隐私保护 数据库管理 Python
用python实现用户注册登陆系统
用python实现用户注册登陆系统
136 0
|
12月前
|
文字识别 C++ Python
pycharml利用ddddocr和selenium识别验证码并登录
1OCR 2 ddddocr 3使用案例 4 常见问题 代码详情 获得XPATH方法
205 0
|
Java 数据安全/隐私保护 Windows
【Java实验五】字符串加密、模拟用户登录、生成验证码、春节倒计时等
1、实验题目:字符串加密 键盘输入一个原始字符串作为明文,然后使用加密方法加密,再对加密字符串进行解密。样例如下图,加密方法自定,完成其功能并测试。
110 0
|
前端开发 PHP
Laravel8 使用图形验证码做登录
一、 安装扩展包 composer require gregwar/captcha
|
JavaScript 前端开发 数据安全/隐私保护
前端案例:简易登录表单的制作,包括用户名、密码、随机验证码(代码完整,复制即用)
前端案例:简易登录表单的制作,包括用户名、密码、随机验证码(代码完整,复制即用)
451 0
前端案例:简易登录表单的制作,包括用户名、密码、随机验证码(代码完整,复制即用)
|
机器学习/深度学习 安全 Java
不得不说这个验证码生成库,牛逼了!
不得不说这个验证码生成库,牛逼了!
534 0
不得不说这个验证码生成库,牛逼了!
|
Java BI Maven
学会这个工具的使用,让你快速生成验证码
前言 验证码是我们做人机验证最常用的方式,常用于敏感操作的验证,比如:登录、注册、修改等。 验证码的原理:不同的客户端拥有不同的 session 对象,在看到验证码图片的时刻,服务器后端代码生成图片并将随机字符存储到 session 中。
1178 0
|
Python
每次登录验证都用Python来识别验证码,真的是太方便了!
每次登录验证都用Python来识别验证码,真的是太方便了!
1311 0