效果图

要使用 Tkinter 实现复杂二维码生成工具(支持自定义内容、颜色、logo、纠错级别、尺寸等),需结合 qrcode 库(生成二维码)和 PIL(处理图片/Logo)。以下是完整的实现代码,包含图形界面和核心功能:
首先安装所需库:
pip install tkinter qrcode[pil] pillowimport 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()该工具支持以下复杂二维码生成功能:
#FF0000)或颜色名(如red),也可通过颜色选择器可视化选择。该工具满足日常复杂二维码生成需求,可直接运行,也可根据需要扩展更多功能(如批量生成、自定义形状、添加文字等)。
点击【关注+收藏】获取最新的实战代码案例
特别声明:
1:接收最新文章代码,请点击下方并关注+收藏公众号!
Python实现中文图片文字处理器——让汉字“贴图”飞一会儿!
Python实现诊断证明书编辑器——从 0 到 1 的“土味”GUI 之旅
Python-Ai基于火山方舟&豆包API的全屏实时聊天应用
用Python打造汉字笔画查询工具:从GUI界面到笔顺动画实现