当前位置:首页>python>【一周精选】Python实现复杂二维码生成工具

【一周精选】Python实现复杂二维码生成工具

  • 2026-10-09 08:55:20
【一周精选】Python实现复杂二维码生成工具

效果图

要使用 Tkinter 实现复杂二维码生成工具(支持自定义内容、颜色、logo、纠错级别、尺寸等),需结合 qrcode 库(生成二维码)和 PIL(处理图片/Logo)。以下是完整的实现代码,包含图形界面和核心功能:

前置依赖安装

首先安装所需库:

pip install tkinter qrcode[pil] pillow

完整代码实现

import tkinter as tkfrom tkinter import ttk, filedialog, messageboximport qrcodefrom PIL import Image, ImageTk, ImageDrawimport osclassComplexQRCodeGenerator:def__init__(self, root):        self.root = root        self.root.title("复杂二维码生成工具")        self.root.geometry("800x650")        self.root.resizable(False, False)# 初始化变量        self.qr_content = tk.StringVar()  # 二维码内容        self.qr_version = tk.IntVar(value=5)  # 二维码版本(1-40,越大越复杂)        self.qr_error_correction = tk.StringVar(value="H")  # 纠错级别(L/M/Q/H)        self.qr_box_size = tk.IntVar(value=10)  # 每个小方格像素        self.qr_border = tk.IntVar(value=2)  # 边框大小        self.qr_fill_color = tk.StringVar(value="#000000")  # 二维码颜色        self.qr_back_color = tk.StringVar(value="#FFFFFF")  # 背景颜色        self.logo_path = tk.StringVar()  # Logo路径        self.logo_size_ratio = tk.DoubleVar(value=0.2)  # Logo占二维码比例# 生成的二维码对象        self.qr_image = None        self.preview_label = None# 创建界面        self.create_widgets()defcreate_widgets(self):# ========== 第一行:内容输入 ==========        frame1 = ttk.LabelFrame(self.root, text="二维码内容", padding=10)        frame1.pack(fill="x", padx=20, pady=10)        ttk.Label(frame1, text="内容:").grid(row=0, column=0, sticky="w", padx=5)        content_entry = ttk.Entry(frame1, textvariable=self.qr_content, width=80)        content_entry.grid(row=0, column=1, padx=5, pady=5)# ========== 第二行:基础参数 ==========        frame2 = ttk.LabelFrame(self.root, text="基础参数", padding=10)        frame2.pack(fill="x", padx=20, pady=5)# 版本        ttk.Label(frame2, text="版本(1-40):").grid(row=0, column=0, sticky="w", padx=5)        version_spin = ttk.Spinbox(frame2, from_=1, to=40, textvariable=self.qr_version, width=10)        version_spin.grid(row=0, column=1, padx=5, pady=5)# 纠错级别        ttk.Label(frame2, text="纠错级别:").grid(row=0, column=2, sticky="w", padx=5)        error_combo = ttk.Combobox(frame2, textvariable=self.qr_error_correction,                                    values=["L", "M", "Q", "H"], width=8)        error_combo.grid(row=0, column=3, padx=5, pady=5)# 方格大小        ttk.Label(frame2, text="方格像素:").grid(row=0, column=4, sticky="w", padx=5)        box_spin = ttk.Spinbox(frame2, from_=1, to=20, textvariable=self.qr_box_size, width=10)        box_spin.grid(row=0, column=5, padx=5, pady=5)# 边框大小        ttk.Label(frame2, text="边框大小:").grid(row=0, column=6, sticky="w", padx=5)        border_spin = ttk.Spinbox(frame2, from_=0, to=10, textvariable=self.qr_border, width=10)        border_spin.grid(row=0, column=7, padx=5, pady=5)# ========== 第三行:颜色设置 ==========        frame3 = ttk.LabelFrame(self.root, text="颜色设置", padding=10)        frame3.pack(fill="x", padx=20, pady=5)        ttk.Label(frame3, text="二维码颜色:").grid(row=0, column=0, sticky="w", padx=5)        fill_entry = ttk.Entry(frame3, textvariable=self.qr_fill_color, width=15)        fill_entry.grid(row=0, column=1, padx=5, pady=5)        ttk.Button(frame3, text="选择颜色", command=self.choose_fill_color).grid(row=0, column=2, padx=5)        ttk.Label(frame3, text="背景颜色:").grid(row=0, column=3, sticky="w", padx=5)        back_entry = ttk.Entry(frame3, textvariable=self.qr_back_color, width=15)        back_entry.grid(row=0, column=4, padx=5, pady=5)        ttk.Button(frame3, text="选择颜色", command=self.choose_back_color).grid(row=0, column=5, padx=5)# ========== 第四行:Logo设置 ==========        frame4 = ttk.LabelFrame(self.root, text="Logo设置", padding=10)        frame4.pack(fill="x", padx=20, pady=5)        ttk.Label(frame4, text="Logo路径:").grid(row=0, column=0, sticky="w", padx=5)        logo_entry = ttk.Entry(frame4, textvariable=self.logo_path, width=40)        logo_entry.grid(row=0, column=1, padx=5, pady=5)        ttk.Button(frame4, text="选择Logo", command=self.select_logo).grid(row=0, column=2, padx=5)        ttk.Label(frame4, text="Logo比例:").grid(row=0, column=3, sticky="w", padx=5)        logo_spin = ttk.Spinbox(frame4, from_=0.1, to=0.5, increment=0.05,                                 textvariable=self.logo_size_ratio, width=10)        logo_spin.grid(row=0, column=4, padx=5, pady=5)# ========== 第五行:操作按钮 ==========        frame5 = ttk.Frame(self.root, padding=10)        frame5.pack(fill="x", padx=20, pady=10)        ttk.Button(frame5, text="生成二维码", command=self.generate_qr).grid(row=0, column=0, padx=10)        ttk.Button(frame5, text="保存二维码", command=self.save_qr).grid(row=0, column=1, padx=10)        ttk.Button(frame5, text="清空参数", command=self.clear_params).grid(row=0, column=2, padx=10)# ========== 预览区域 ==========        frame6 = ttk.LabelFrame(self.root, text="二维码预览", padding=10)        frame6.pack(fill="both", expand=True, padx=20, pady=10)        self.preview_label = ttk.Label(frame6)        self.preview_label.pack(expand=True)defchoose_fill_color(self):"""选择二维码填充颜色"""        color = tk.colorchooser.askcolor(title="选择二维码颜色")[1]if color:            self.qr_fill_color.set(color)defchoose_back_color(self):"""选择背景颜色"""        color = tk.colorchooser.askcolor(title="选择背景颜色")[1]if color:            self.qr_back_color.set(color)defselect_logo(self):"""选择Logo图片"""        file_path = filedialog.askopenfilename(            title="选择Logo图片",            filetypes=[("图片文件", "*.png *.jpg *.jpeg *.gif *.bmp")]        )if file_path:            self.logo_path.set(file_path)defgenerate_qr(self):"""生成二维码(带Logo/自定义参数)"""try:# 1. 验证内容            content = self.qr_content.get().strip()ifnot content:                messagebox.warning("警告", "二维码内容不能为空!")return# 2. 解析参数            version = self.qr_version.get()            error_correction = {"L": qrcode.constants.ERROR_CORRECT_L,"M": qrcode.constants.ERROR_CORRECT_M,"Q": qrcode.constants.ERROR_CORRECT_Q,"H": qrcode.constants.ERROR_CORRECT_H            }[self.qr_error_correction.get()]            box_size = self.qr_box_size.get()            border = self.qr_border.get()            fill_color = self.qr_fill_color.get()            back_color = self.qr_back_color.get()            logo_path = self.logo_path.get().strip()            logo_ratio = self.logo_size_ratio.get()# 3. 生成基础二维码            qr = qrcode.QRCode(                version=version,                error_correction=error_correction,                box_size=box_size,                border=border,            )            qr.add_data(content)            qr.make(fit=True)# 4. 生成二维码图片(自定义颜色)            self.qr_image = qr.make_image(                fill_color=fill_color,                back_color=back_color            ).convert("RGB")# 5. 添加Logo(如果选择了Logo)if logo_path and os.path.exists(logo_path):# 打开Logo并调整大小                logo = Image.open(logo_path).convert("RGBA")                qr_width, qr_height = self.qr_image.size                logo_size = int(qr_width * logo_ratio)                logo = logo.resize((logo_size, logo_size), Image.Resampling.LANCZOS)# 计算Logo位置(居中)                pos = ((qr_width - logo_size) // 2, (qr_height - logo_size) // 2)# 给Logo添加白色圆角背景(可选,提升美观度)                logo_background = Image.new("RGBA", logo.size, (255, 255, 255, 255))                draw = ImageDraw.Draw(logo_background)                draw.rounded_rectangle((0, 0, logo_size, logo_size), radius=10, fill=(255, 255, 255))                logo = Image.alpha_composite(logo_background, logo).convert("RGB")# 粘贴Logo到二维码                self.qr_image.paste(logo, pos)# 6. 显示预览            preview_image = self.qr_image.resize((300, 300), Image.Resampling.LANCZOS)            tk_image = ImageTk.PhotoImage(preview_image)            self.preview_label.config(image=tk_image)            self.preview_label.image = tk_image  # 保留引用,防止被垃圾回收except Exception as e:            messagebox.showerror("错误", f"生成二维码失败:{str(e)}")defsave_qr(self):"""保存生成的二维码"""ifnot self.qr_image:            messagebox.warning("警告", "请先生成二维码!")returntry:            save_path = filedialog.asksaveasfilename(                title="保存二维码",                defaultextension=".png",                filetypes=[("PNG图片", "*.png"), ("JPG图片", "*.jpg"), ("所有文件", "*.*")]            )if save_path:                self.qr_image.save(save_path)                messagebox.showinfo("成功", f"二维码已保存到:{save_path}")except Exception as e:            messagebox.showerror("错误", f"保存失败:{str(e)}")defclear_params(self):"""清空所有参数"""        self.qr_content.set("")        self.qr_version.set(5)        self.qr_error_correction.set("H")        self.qr_box_size.set(10)        self.qr_border.set(2)        self.qr_fill_color.set("#000000")        self.qr_back_color.set("#FFFFFF")        self.logo_path.set("")        self.logo_size_ratio.set(0.2)        self.preview_label.config(image="")        self.qr_image = Noneif __name__ == "__main__":    root = tk.Tk()    app = ComplexQRCodeGenerator(root)    root.mainloop()

功能说明

该工具支持以下复杂二维码生成功能:

  1. 自定义内容:文本、网址、联系方式等任意字符串。
  2. 基础参数调整:
    • 版本(1-40):版本越高,可存储内容越多,二维码越复杂。
    • 纠错级别(L/M/Q/H):H级容错率最高(30%内容可恢复)。
    • 方格像素/边框大小:调整二维码清晰度和边框宽度。
  3. 颜色自定义:支持十六进制颜色码(如#FF0000)或颜色名(如red),也可通过颜色选择器可视化选择。
  4. Logo嵌入:
    • 支持添加PNG/JPG等格式的Logo。
    • 可调整Logo大小比例(0.1-0.5)。
    • 自动给Logo添加圆角白底,提升美观度。
  5. 预览与保存:实时预览生成的二维码,支持保存为PNG/JPG格式。

使用方法

  1. 运行代码,打开图形界面。
  2. 输入二维码内容(如网址、文本)。
  3. 调整参数(版本、纠错级别、颜色等),可选添加Logo。
  4. 点击「生成二维码」预览效果。
  5. 点击「保存二维码」将生成的二维码保存到本地。

注意事项

  1. Logo建议使用透明背景的PNG图片,效果更佳。
  2. 纠错级别建议选H(高容错),嵌入Logo后仍能正常扫描。
  3. 版本越高,二维码越复杂,扫描难度略有增加,建议根据内容长度选择合适版本。
  4. 颜色对比度过低(如浅灰底浅蓝字)可能导致二维码无法扫描,建议使用高对比度配色。

该工具满足日常复杂二维码生成需求,可直接运行,也可根据需要扩展更多功能(如批量生成、自定义形状、添加文字等)。

点击【关注+收藏】获取最新的实战代码案例

特别声明:

1:接收最新文章代码,请点击下方并关注+收藏公众号! 

Python 20天的学习计划

Python的 7 天 学习计划

Python实现蜈蚣小游戏

Python实现打地鼠

Python实现Ai对战五子棋

Python实现哪吒打字打气球

Python实现各种请假诊断证明书

Python实现暴力破解程序

Python实现自定义印章生成小工具

Python实现印章阈值抠图小助手

Python实现各种请假诊断证明书

Python实现太空侵略者

Python实现俄罗斯方块小游戏

Python实现吃豆人代码全源码解析

Python实现汉字打砖块小游戏

Python实现随机多样式多等级的迷宫生成器

Python实现贪吃蛇小游戏

Python实现暴力破解程序

Python证件照多尺寸生成器

Python实现视频播放器

Python实现简单电脑进程管理器

Python实现自定义印章生成小工具

Python实现简易房租汇总计算器

Python一键生成带印章的word请假条

Python实现批量生产证书工厂

Python实现叶子雕刻图

Python-Flask实现智慧刷题系统

Python-Flask实现各种样式的奖状生成器

Python实现随机多样式多等级的迷宫生成器

Python实现各种请假诊断证明书

Python实现印章秒修小神器

Python实现中文图片文字处理器——让汉字“贴图”飞一会儿!

Python证件照多尺寸生成器

Python证件照多尺寸生成器

Python实现各种请假诊断证明书

Python实现把 Word 当口播稿,把键盘敲成主播台!

Python实现诊断证明书编辑器——从 0 到 1 的“土味”GUI 之旅

Python实现把 Word 当口播稿,把键盘敲成主播台!

Python-Ai基于火山方舟&豆包API的全屏实时聊天应用

Python实现简易房租汇总计算器

Python实现类似postman调用

Python实现局域网文件共享神器

Python实现在线书法生成器

Python实现叶子雕刻图

Python证件照多尺寸生成器

Python实现人像证件照背景替换

Python开发自定义打包exe程序

Python实现印章生成器

Python实现简易房租汇总计算器

Python实现哪吒打字打气球

Python实现批量生产证书工厂

Python一键生成带印章的word请假条

Python快捷ps图片取色等编辑器

Python实现批量生产证书工厂

Python快捷ps图片取色等编辑器

Python实现自定义取色器

Python实现自动变成温柔水彩素描

Python实现创意画板代码

用Python打造汉字笔画查询工具:从GUI界面到笔顺动画实现

Python实现表情包制作器

Python实现中国象棋小游戏

Python实现印章生成器

Python模拟实现金山打字通

Python超实用 Markdown 转富文本神器 —— 代码全解析

Python实现贪吃蛇小游戏源码解析

Python实现二维码生成

Python实现视频播放器

Python实现印章生成器

Python实现在线印章制作

Python+Ai实现一个简单的智能语音小助手

Python实现简单记事本

Python实现Markdown转HTML工具代码

Python实现创意画板代码

Python实现简易图画工具代码

Python实现视频播放器

Python实现简单记事本

Python 实现连连看游戏代码解析

Python实现简单电脑进程管理器

Python一个超实用的工具-词频统计工具

Python简易爬虫天气工具

Python定时任务提醒工具

Python《猜数字游戏代码解析》

Python《简易计算器代码解析》

Python+Ai在线文档生成小助手

Python 《密码生成器代码解析》

Python|+Ai实现一个简单的智能语音小助手

Python实现简易图画工具代码

Python实现Markdown转Html

Python实现视频播放器

Python 实现连连看游戏代码解析

Python实现火山AI调用生成故事

Python实现豆包Ai调用生成故事

Python实现简单记事本

Python实现简单电脑进程管理器

最新文章

随机文章