多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

python-mini-projects 实战:基于 captcha 库与 tkinter 构建图像验证码生成与验证工具

python-mini-projects 实战:基于 captcha 库与 tkinter 构建图像验证码生成与验证工具 示例工程【免费下载链接】python-mini-projectsA collection of simple python mini projects to enhance your python skills项目地址https://gitcode.com/gh_mirrors/py/python-mini-projects点击查看免费下载导读本文围绕 python-mini-projects 仓库中projects/Captcha_Genrator目录下的图像验证码生成器展开系统讲解如何基于 Pythoncaptcha库生成 6 位随机数字验证码图片并借助tkinter搭建完整的展示—输入—校验—刷新桌面验证流程。读完本文你将掌握ImageCaptcha的字体配置与图片生成用法理解验证码生成、验证、刷新的完整实现链路并能将这套方案迁移到 Web 应用或自动化测试场景中。一、项目概览一个极简但完整的验证码生成器该子项目位于 projects/Captcha_Genrator/README.md定位是A simple image captcha genrator一个简单的图像验证码生成器。麻雀虽小却覆盖了验证码系统的三个关键环节生成利用captcha库的ImageCaptcha类将随机数字渲染为带干扰效果的图片展示通过tkinter图形界面显示验证码图片并提供输入框校验比对用户输入与生成的随机码给出验证通过/未通过反馈未通过时自动刷新验证码。其核心代码仅一个文件 Captcha_Genrator.py约 56 行依赖声明见 requirements.txt非常适合作为学习验证码原理与桌面 GUI 编程的入门范本。二、环境准备依赖安装与字体路径配置2.1 安装依赖项目依赖极简整个项目只需要captcha一个第三方库。在原文档中给出的安装命令为pip install -r requirements.txt其中 requirements.txt 的全部内容为captcha该库由pip install captcha安装内部依赖Pillow完成图片渲染ImageCaptcha底层基于 PIL 图像操作。如果不使用requirements.txt也可以直接执行pip install captcha2.2 字体准备与路径更新原文档强调的关键步骤原文档明确指出安装依赖后还需要Update the path of font in code (if required)即更新代码中的字体路径image ImageCaptcha(fonts[path/ChelseaMarketsr.ttf, path/DejaVuSanssr.ttf])之所以需要手动指定字体是因为ImageCaptcha在创建验证码图片时需要字体文件来绘制字符若不传入fonts参数库会使用自带的默认字体。指定多个字体后验证码中的字符会在这些字体间随机选取渲染从而增强字符的多样性。仓库中已经随项目提供了这两个字体文件位于 projects/Captcha_Genrator/fonts/ChelseaMarketsr.ttfChelsea Market 风格的手写感装饰字体字符形态夸张、辨识度高DejaVuSanssr.ttfDejaVu Sans 无衬线字体笔画规整清晰是跨平台渲染的常用字体。两个字体风格一花哨一规整组合使用既保证了验证码的视觉辨识度又增加了字符形态的不确定性。2.3 路径写法与跨平台注意事项从源码 Captcha_Genrator.py 可以看到原实现中使用的是 Windows 绝对路径image ImageCaptcha(fonts[C:/Users/Administrator/Downloads/ChelseaMarketsr.ttf, C:/Users/Administrator/Downloads/DejaVuSanssr.ttf])该路径是作者本机环境的硬编码在实际运行时需要按自身环境调整。若已 clone 本仓库推荐直接使用仓库内的字体并采用相对路径在projects/Captcha_Genrator/目录下运行image ImageCaptcha(fonts[fonts/ChelseaMarketsr.ttf, fonts/DejaVuSanssr.ttf])或在 Linux/macOS 上使用绝对路径image ImageCaptcha(fonts[/your/path/projects/Captcha_Genrator/fonts/ChelseaMarketsr.ttf, /your/path/projects/Captcha_Genrator/fonts/DejaVuSanssr.ttf])注意本项目的 GUI 基于tkinter在 Windows 上随标准 Python 发行版自带在部分 Linux 发行版上需要单独安装python3-tk包如sudo apt install python3-tk才能正常弹窗运行。三、运行方式完成依赖安装与字体路径修正后直接执行python Captcha_Genrator.py程序启动后会弹出 tkinter 窗口窗口中自上而下依次为验证码图片标签显示生成的out.png图片尺寸固定为100x200见下文源码分析文本输入框供用户输入看到的验证码数字submit 按钮提交输入进行校验refresh 按钮手动刷新生成一张新验证码。四、源码级解析从生成到校验的完整链路下面结合 Captcha_Genrator.py 逐段剖析实现细节。4.1 生成验证码图片from io import BytesIO from captcha.image import ImageCaptcha image ImageCaptcha(fonts[C:/Users/Administrator/Downloads/ChelseaMarketsr.ttf, C:/Users/Administrator/Downloads/DejaVuSanssr.ttf]) randomstr(randint(100000,999999)) data image.generate(random) assert isinstance(data, BytesIO) image.write(random,out.png)关键点解读ImageCaptcha(fonts[...])构造验证码生成器实例。代码未显式传入width/height因此使用captcha库的默认画布尺寸 280x90 像素fonts列表中的字体会被随机挑选用于绘制字符。生成器实例在模块顶层创建一次后续生成、刷新均复用该实例。random str(randint(100000, 999999))从 100000 到 999999 之间随机取整得到 6 位纯数字验证码转成字符串供渲染。字符串中的每个字符会以独立随机角度、位置和颜色绘制在图片上形成扭曲噪点的典型验证码效果。data image.generate(random)生成验证码图片并返回一个BytesIO内存文件对象。紧接着的assert isinstance(data, BytesIO)是对返回类型的防御性校验用于确保图片数据确实以内存流形式产出可被后续代码安全使用。image.write(random, out.png)将验证码图片落盘保存为out.png。注意write的第一个参数是验证码字符串而非文件名——ImageCaptcha.write会先把该字符串渲染成图片再写入指定文件路径因此out.png中呈现的正是变量random对应的数字组合。一个小细节模块顶部虽导入了import string但实际随机码仅由数字组成string模块并未被使用若希望扩展到字母数字混合验证码可改用.join(choice(string.ascii_letters string.digits) for _ in range(6))需同步引入choice这也是从当前代码结构最容易延伸的增强点。4.2 GUI 界面搭建rootTk() photo PhotoImage(fileout.png) l1Label(root,imagephoto,height100,width200) t1Text(root,height5,width50) b1Button(root,textsubmit,commandverify) b2Button(root,textrefresh,commandrefresh) l1.pack() t1.pack() b1.pack() b2.pack() root.mainloop()PhotoImage(fileout.png)读取刚刚生成的验证码图片绑定到Label组件上显示Label的height100, width200为显示区域尺寸单位为像素级别保证验证码图片有足够的展示空间Text组件5 行高、50 字符宽充当输入框后续通过t1.get(0.0, END)读取全文两个Button分别绑定verify校验与refresh刷新回调所有组件通过pack()垂直堆叠布局最后root.mainloop()进入 tkinter 事件循环。4.3 校验逻辑 verify()def verify(): global random xt1.get(0.0,END) if (int(x)int(random)): messagebox.showinfo(sucsess, verified) else: messagebox.showinfo(Alert, Not verified) refresh()校验流程分三步t1.get(0.0, END)取出输入框从第 0 行第 0 列到末尾的全部文本将输入与正确验证码都转为int后比较int()会自动忽略首尾空白与换行符因此Text组件取回的换行不影响比较相等则弹出sucsess / verified成功提示不等则弹出Alert / Not verified警告并自动调用refresh()生成新验证码避免用户在旧码上反复尝试。4.4 刷新逻辑 refresh()def refresh(): randomstr(randint(100000,999999)) data image.generate(random) assert isinstance(data, BytesIO) image.write(random,out.png) photo PhotoImage(fileout.png) l1.config(imagephoto,height100,width200) l1.update() UpdateLabel()刷新逻辑实际上是重新走一遍生成流程重新抽取 6 位随机数并渲染、落盘覆盖out.png重新读取图片文件通过l1.config(imagephoto, ...)更新Label中显示的图片调用l1.update()强制界面立即重绘使用户看到的验证码立刻切换。从源码结构看UpdateLabel()在此处被调用但同文件中并未定义该函数若直接运行原代码刷新时会因NameError中断。移植使用时可将该行删除或替换为t1.delete(1.0, END)之类的输入框清空操作保证刷新后输入框同步复位——这是本示例代码中一个值得注意的健壮性问题。另外random在global random声明下被赋值为字符串遮蔽了模块顶部的random模块名由于随机数通过from random import *引入的randint直接调用不依赖模块对象本身因此功能上不受影响但属于值得改进的命名习惯建议改用captcha_text等描述性变量名。五、核心工作流总结综合以上分析本项目的完整执行链路可以归纳为启动 → 随机生成 6 位数字 → ImageCaptcha 渲染为图片 → 保存 out.png → tkinter 窗口展示图片 输入框 → 用户点击 submit → 输入与随机码比对 ├─ 一致 → 弹出成功提示 └─ 不一致 → 弹出失败提示 → 自动刷新重新生成 界面更新 → 用户点击 refresh → 手动刷新验证码其中ImageCaptcha的generate()负责内存级图片产出BytesIOwrite()负责磁盘落盘tkinter负责图片展示与交互回调三者各司其职。六、延伸把验证码能力复用到其他场景虽然本示例以 tkinter 桌面应用演示但captcha库的核心能力与 GUI 完全解耦可以低成本迁移Web 后端用image.generate(code)得到BytesIO后可直接经 Flask/Django 的响应对象输出为image/png同时把code存入 Session 用于表单校验自动化测试调用image.write(code, path)批量生成不同验证码样本用于 OCR 或图像分类模型的训练与评测参数调优ImageCaptcha还支持width、height、font_sizes等构造参数可通过调整画布尺寸与字号区间控制验证码的辨识难度。如需进一步查阅其他 Python 迷你项目作为参考可浏览仓库 projects/ 目录本项目的依赖安装与字体路径更新等步骤也完全遵循 projects/Captcha_Genrator/README.md 中给出的前置条件执行。赞分享示例工程【免费下载链接】python-mini-projectsA collection of simple python mini projects to enhance your python skills项目地址https://gitcode.com/gh_mirrors/py/python-mini-projects点击查看免费下载相关推荐captcha-tensorflow基于TensorFlow的验证码识别captcha tensorflow基于TensorFlow的验证码识别 项目介绍 captcha tensorflow是一个开源项目旨在利用TensorF基于 Pillow 的 JPEG 转 PNG 图片转换python-mini-projects 终端脚本与 Tkinter 图形界面实战基于 Pillow 的 JPEG 转 PNG 图片转换python mini projects 终端脚本与 Tkinter 图形界面实战 本篇技术指南以 pr示例工程基于 Tkinter 的零售计费系统实战python-mini-projects 之 Billing System 源码全解析基于 Tkinter 的零售计费系统实战python mini projects 之 Billing System 源码全解析 本篇文章以 python mi示例工程上一篇如何在PC上构建Switch游戏模拟器Ryujinx开源项目的深度技术解析与实战指南下一篇Formbricks v3.12.0重磅发布会话管理全面升级用户体验再攀新峰创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表