您好,登录后才能下订单哦!
验证码(CAPTCHA)是一种用于区分人类用户和自动化程序的测试。它通常用于防止恶意机器人滥用网络服务。验证码的形式多种多样,包括文本、图像、音频等。本文将介绍如何使用Python的wxPython库制作一个有趣的验证码生成器。
在开始之前,我们需要安装一些必要的库。首先,确保你已经安装了Python 3.x版本。然后,使用以下命令安装wxPython和Pillow库:
pip install wxPython Pillow
wxPython是一个用于创建桌面应用程序的Python库,而Pillow是一个用于图像处理的Python库。
首先,我们创建一个基本的wxPython窗口,用于显示生成的验证码。
import wx
class CaptchaGenerator(wx.Frame):
    def __init__(self, *args, **kw):
        super(CaptchaGenerator, self).__init__(*args, **kw)
        self.InitUI()
    def InitUI(self):
        self.SetTitle("验证码生成器")
        self.SetSize((400, 300))
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.captcha_label = wx.StaticText(panel, label="验证码")
        vbox.Add(self.captcha_label, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        self.captcha_image = wx.StaticBitmap(panel)
        vbox.Add(self.captcha_image, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        generate_button = wx.Button(panel, label="生成验证码")
        generate_button.Bind(wx.EVT_BUTTON, self.OnGenerate)
        vbox.Add(generate_button, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        panel.SetSizer(vbox)
    def OnGenerate(self, event):
        pass
if __name__ == "__main__":
    app = wx.App()
    frame = CaptchaGenerator(None)
    frame.Show()
    app.MainLoop()
在这个代码中,我们创建了一个CaptchaGenerator类,继承自wx.Frame。在InitUI方法中,我们设置了窗口的标题和大小,并创建了一个面板。面板上包含一个标签、一个用于显示验证码图像的StaticBitmap控件和一个生成验证码的按钮。
接下来,我们需要实现生成验证码的功能。我们将使用Pillow库来生成验证码图像。
import random
from PIL import Image, ImageDraw, ImageFont
class CaptchaGenerator(wx.Frame):
    def __init__(self, *args, **kw):
        super(CaptchaGenerator, self).__init__(*args, **kw)
        self.InitUI()
    def InitUI(self):
        self.SetTitle("验证码生成器")
        self.SetSize((400, 300))
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.captcha_label = wx.StaticText(panel, label="验证码")
        vbox.Add(self.captcha_label, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        self.captcha_image = wx.StaticBitmap(panel)
        vbox.Add(self.captcha_image, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        generate_button = wx.Button(panel, label="生成验证码")
        generate_button.Bind(wx.EVT_BUTTON, self.OnGenerate)
        vbox.Add(generate_button, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        panel.SetSizer(vbox)
    def OnGenerate(self, event):
        captcha_text = self.generate_captcha_text()
        captcha_image = self.generate_captcha_image(captcha_text)
        captcha_image.SaveFile("captcha.png", wx.BITMAP_TYPE_PNG)
        self.captcha_image.SetBitmap(wx.Bitmap("captcha.png"))
    def generate_captcha_text(self):
        characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
        captcha_text = ''.join(random.choice(characters) for _ in range(6))
        return captcha_text
    def generate_captcha_image(self, text):
        width, height = 200, 100
        image = Image.new('RGB', (width, height), color=(255, 255, 255))
        draw = ImageDraw.Draw(image)
        font = ImageFont.load_default()
        for i, char in enumerate(text):
            x = 20 + i * 30
            y = random.randint(10, 50)
            draw.text((x, y), char, font=font, fill=(0, 0, 0))
        for _ in range(10):
            x1 = random.randint(0, width)
            y1 = random.randint(0, height)
            x2 = random.randint(0, width)
            y2 = random.randint(0, height)
            draw.line((x1, y1, x2, y2), fill=(0, 0, 0))
        return image
if __name__ == "__main__":
    app = wx.App()
    frame = CaptchaGenerator(None)
    frame.Show()
    app.MainLoop()
在这个代码中,我们添加了generate_captcha_text和generate_captcha_image方法。generate_captcha_text方法生成一个随机的6字符验证码文本,generate_captcha_image方法使用Pillow库生成验证码图像。生成的图像保存为captcha.png,并在窗口中显示。
为了使验证码生成器更有趣,我们可以添加一些额外的功能,例如:
我们可以使用不同的字体和颜色来生成验证码图像。首先,下载一个字体文件(例如arial.ttf),并将其放在项目目录中。
import random
from PIL import Image, ImageDraw, ImageFont
class CaptchaGenerator(wx.Frame):
    def __init__(self, *args, **kw):
        super(CaptchaGenerator, self).__init__(*args, **kw)
        self.InitUI()
    def InitUI(self):
        self.SetTitle("验证码生成器")
        self.SetSize((400, 300))
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.captcha_label = wx.StaticText(panel, label="验证码")
        vbox.Add(self.captcha_label, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        self.captcha_image = wx.StaticBitmap(panel)
        vbox.Add(self.captcha_image, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        generate_button = wx.Button(panel, label="生成验证码")
        generate_button.Bind(wx.EVT_BUTTON, self.OnGenerate)
        vbox.Add(generate_button, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        panel.SetSizer(vbox)
    def OnGenerate(self, event):
        captcha_text = self.generate_captcha_text()
        captcha_image = self.generate_captcha_image(captcha_text)
        captcha_image.SaveFile("captcha.png", wx.BITMAP_TYPE_PNG)
        self.captcha_image.SetBitmap(wx.Bitmap("captcha.png"))
    def generate_captcha_text(self):
        characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
        captcha_text = ''.join(random.choice(characters) for _ in range(6))
        return captcha_text
    def generate_captcha_image(self, text):
        width, height = 200, 100
        image = Image.new('RGB', (width, height), color=(255, 255, 255))
        draw = ImageDraw.Draw(image)
        font = ImageFont.truetype("arial.ttf", 36)
        for i, char in enumerate(text):
            x = 20 + i * 30
            y = random.randint(10, 50)
            color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
            draw.text((x, y), char, font=font, fill=color)
        for _ in range(10):
            x1 = random.randint(0, width)
            y1 = random.randint(0, height)
            x2 = random.randint(0, width)
            y2 = random.randint(0, height)
            color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
            draw.line((x1, y1, x2, y2), fill=color)
        return image
if __name__ == "__main__":
    app = wx.App()
    frame = CaptchaGenerator(None)
    frame.Show()
    app.MainLoop()
在这个代码中,我们使用ImageFont.truetype方法加载字体文件,并为每个字符设置随机颜色。
我们可以通过添加噪声和干扰线来增加验证码的复杂性。
import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter
class CaptchaGenerator(wx.Frame):
    def __init__(self, *args, **kw):
        super(CaptchaGenerator, self).__init__(*args, **kw)
        self.InitUI()
    def InitUI(self):
        self.SetTitle("验证码生成器")
        self.SetSize((400, 300))
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.captcha_label = wx.StaticText(panel, label="验证码")
        vbox.Add(self.captcha_label, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        self.captcha_image = wx.StaticBitmap(panel)
        vbox.Add(self.captcha_image, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        generate_button = wx.Button(panel, label="生成验证码")
        generate_button.Bind(wx.EVT_BUTTON, self.OnGenerate)
        vbox.Add(generate_button, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        panel.SetSizer(vbox)
    def OnGenerate(self, event):
        captcha_text = self.generate_captcha_text()
        captcha_image = self.generate_captcha_image(captcha_text)
        captcha_image.SaveFile("captcha.png", wx.BITMAP_TYPE_PNG)
        self.captcha_image.SetBitmap(wx.Bitmap("captcha.png"))
    def generate_captcha_text(self):
        characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
        captcha_text = ''.join(random.choice(characters) for _ in range(6))
        return captcha_text
    def generate_captcha_image(self, text):
        width, height = 200, 100
        image = Image.new('RGB', (width, height), color=(255, 255, 255))
        draw = ImageDraw.Draw(image)
        font = ImageFont.truetype("arial.ttf", 36)
        for i, char in enumerate(text):
            x = 20 + i * 30
            y = random.randint(10, 50)
            color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
            draw.text((x, y), char, font=font, fill=color)
        for _ in range(10):
            x1 = random.randint(0, width)
            y1 = random.randint(0, height)
            x2 = random.randint(0, width)
            y2 = random.randint(0, height)
            color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
            draw.line((x1, y1, x2, y2), fill=color)
        for _ in range(100):
            x = random.randint(0, width)
            y = random.randint(0, height)
            color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
            draw.point((x, y), fill=color)
        image = image.filter(ImageFilter.BLUR)
        return image
if __name__ == "__main__":
    app = wx.App()
    frame = CaptchaGenerator(None)
    frame.Show()
    app.MainLoop()
在这个代码中,我们添加了100个随机噪声点,并使用ImageFilter.BLUR对图像进行模糊处理。
最后,我们可以添加一个文本框,允许用户输入验证码并验证其正确性。
import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter
class CaptchaGenerator(wx.Frame):
    def __init__(self, *args, **kw):
        super(CaptchaGenerator, self).__init__(*args, **kw)
        self.InitUI()
    def InitUI(self):
        self.SetTitle("验证码生成器")
        self.SetSize((400, 300))
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.captcha_label = wx.StaticText(panel, label="验证码")
        vbox.Add(self.captcha_label, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        self.captcha_image = wx.StaticBitmap(panel)
        vbox.Add(self.captcha_image, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        self.input_text = wx.TextCtrl(panel)
        vbox.Add(self.input_text, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        generate_button = wx.Button(panel, label="生成验证码")
        generate_button.Bind(wx.EVT_BUTTON, self.OnGenerate)
        vbox.Add(generate_button, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        verify_button = wx.Button(panel, label="验证")
        verify_button.Bind(wx.EVT_BUTTON, self.OnVerify)
        vbox.Add(verify_button, 0, wx.ALIGN_CENTER | wx.TOP, 10)
        panel.SetSizer(vbox)
    def OnGenerate(self, event):
        self.captcha_text = self.generate_captcha_text()
        captcha_image = self.generate_captcha_image(self.captcha_text)
        captcha_image.SaveFile("captcha.png", wx.BITMAP_TYPE_PNG)
        self.captcha_image.SetBitmap(wx.Bitmap("captcha.png"))
    def OnVerify(self, event):
        user_input = self.input_text.GetValue()
        if user_input == self.captcha_text:
            wx.MessageBox("验证成功!", "提示", wx.OK | wx.ICON_INFORMATION)
        else:
            wx.MessageBox("验证失败!", "提示", wx.OK | wx.ICON_ERROR)
    def generate_captcha_text(self):
        characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
        captcha_text = ''.join(random.choice(characters) for _ in range(6))
        return captcha_text
    def generate_captcha_image(self, text):
        width, height = 200, 100
        image = Image.new('RGB', (width, height), color=(255, 255, 255))
        draw = ImageDraw.Draw(image)
        font = ImageFont.truetype("arial.ttf", 36)
        for i, char in enumerate(text):
            x = 20 + i * 30
            y = random.randint(10, 50)
            color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
            draw.text((x, y), char, font=font, fill=color)
        for _ in range(10):
            x1 = random.randint(0, width)
            y1 = random.randint(0, height)
            x2 = random.randint(0, width)
            y2 = random.randint(0, height)
            color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
            draw.line((x1, y1, x2, y2), fill=color)
        for _ in range(100):
            x = random.randint(0, width)
            y = random.randint(0, height)
            color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
            draw.point((x, y), fill=color)
        image = image.filter(ImageFilter.BLUR)
        return image
if __name__ == "__main__":
    app = wx.App()
    frame = CaptchaGenerator(None)
    frame.Show()
    app.MainLoop()
在这个代码中,我们添加了一个文本框和一个验证按钮。用户输入验证码后,点击验证按钮,程序会检查输入是否正确,并显示相应的提示信息。
通过本文的介绍,我们学习了如何使用wxPython和Pillow库制作一个有趣的验证码生成器。我们实现了生成随机验证码文本、绘制验证码图像、添加噪声和干扰线、以及验证用户输入的功能。这个验证码生成器可以用于各种需要防止机器人滥用的场景。希望本文对你有所帮助!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。