您好,登录后才能下订单哦!
验证码(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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。