当前位置: 首页 > news >正文

二维码生成器

import qrcode
import tkinter as tk
from tkinter import filedialog, colorchooser, messagebox, ttk
import os
from PIL import Image, ImageTkclass QRCodeGenerator:def __init__(self, root):self.root = rootself.root.title("Monkey二维码生成器-[url=https://www.ltxit.com/]https://www.ltxit.com/[/url]")self.root.geometry("600x600")self.root.resizable(True, True)self.root.configure(bg="#f0f0f0")# 设置中文字体self.font = ("SimHei", 10)# 创建主框架self.main_frame = ttk.Frame(root, padding="20")self.main_frame.pack(fill=tk.BOTH, expand=True)# 输入类型选择ttk.Label(self.main_frame, text="输入类型:", font=self.font).grid(row=0, column=0, sticky=tk.W, pady=5)self.input_type = tk.StringVar(value="网址")input_types = ["文本", "网址", "文件"]self.type_combo = ttk.Combobox(self.main_frame, textvariable=self.input_type, values=input_types,state="readonly", width=20)self.type_combo.grid(row=0, column=1, sticky=tk.W, pady=5)self.type_combo.bind("<<ComboboxSelected>>", self.on_input_type_changed)# 输入框ttk.Label(self.main_frame, text="输入内容:", font=self.font).grid(row=1, column=0, sticky=tk.W, pady=5)self.input_text = tk.Text(self.main_frame, height=5, width=40, font=self.font)self.input_text.grid(row=1, column=1, sticky=(tk.W, tk.E), pady=5)# 文件选择按钮self.file_button = ttk.Button(self.main_frame, text="选择文件", command=self.select_file)self.file_button.grid(row=1, column=2, sticky=tk.W, padx=5, pady=5)self.file_path_var = tk.StringVar()self.file_path_label = ttk.Label(self.main_frame, textvariable=self.file_path_var, font=("SimHei", 9),foreground="blue")self.file_path_label.grid(row=2, column=1, sticky=tk.W, pady=2)# 二维码大小滑块ttk.Label(self.main_frame, text="二维码大小:", font=self.font).grid(row=3, column=0, sticky=tk.W, pady=5)self.size_var = tk.IntVar(value=128)self.size_scale = ttk.Scale(self.main_frame, from_=100, to=600, variable=self.size_var, orient=tk.HORIZONTAL,length=200)self.size_scale.grid(row=3, column=1, sticky=tk.W, pady=5)self.size_label = ttk.Label(self.main_frame, text="128", font=self.font, width=5)self.size_label.grid(row=3, column=1, sticky=tk.E, pady=5)self.size_scale.bind("<Motion>", self.update_size_label)self.size_scale.bind("<ButtonRelease-1>", self.update_size_label)# 容错级别选择ttk.Label(self.main_frame, text="容错级别:", font=self.font).grid(row=4, column=0, sticky=tk.W, pady=5)self.error_correction = tk.StringVar(value="中等")error_levels = ["", "中等", "", "最高"]self.error_combo = ttk.Combobox(self.main_frame, textvariable=self.error_correction, values=error_levels,state="readonly", width=10)self.error_combo.grid(row=4, column=1, sticky=tk.W, pady=5)# 背景颜色选择ttk.Label(self.main_frame, text="背景颜色:", font=self.font).grid(row=5, column=0, sticky=tk.W, pady=5)self.bg_color_var = tk.StringVar(value="white")self.bg_color_display = ttk.Label(self.main_frame, text="     ", background="white", relief=tk.SUNKEN,borderwidth=1)self.bg_color_display.grid(row=5, column=1, sticky=tk.W, padx=5, pady=5)self.bg_color_button = ttk.Button(self.main_frame, text="选择颜色", command=self.choose_bg_color)self.bg_color_button.grid(row=5, column=1, sticky=tk.E, padx=5, pady=5)# 边框大小选择ttk.Label(self.main_frame, text="边框大小:", font=self.font).grid(row=6, column=0, sticky=tk.W, pady=5)self.border_var = tk.IntVar(value=1)self.border_scale = ttk.Scale(self.main_frame, from_=0, to=10, variable=self.border_var, orient=tk.HORIZONTAL,length=200)self.border_scale.grid(row=6, column=1, sticky=tk.W, pady=5)self.border_label = ttk.Label(self.main_frame, text="1", font=self.font, width=5)self.border_label.grid(row=6, column=1, sticky=tk.E, pady=5)self.border_scale.bind("<Motion>", self.update_border_label)self.border_scale.bind("<ButtonRelease-1>", self.update_border_label)# 生成按钮self.generate_button = ttk.Button(self.main_frame, text="生成二维码", command=self.generate_qrcode,style='Accent.TButton')self.generate_button.grid(row=7, column=1, pady=10)# 二维码显示区域self.qr_frame = ttk.LabelFrame(self.main_frame, text="二维码预览", padding="10")self.qr_frame.grid(row=8, column=0, columnspan=3, sticky=(tk.W, tk.E, tk.N, tk.S), pady=10)self.qr_frame.columnconfigure(0, weight=1)self.qr_frame.rowconfigure(0, weight=1)self.qr_label = ttk.Label(self.qr_frame)self.qr_label.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)# 保存按钮self.save_button = ttk.Button(self.main_frame, text="保存二维码", command=self.save_qrcode, state=tk.DISABLED)self.save_button.grid(row=9, column=1, pady=5)# 状态栏self.status_var = tk.StringVar(value="就绪")self.status_bar = ttk.Label(root, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W)self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)# 配置列和行的权重,使界面可缩放self.main_frame.columnconfigure(1, weight=1)self.main_frame.rowconfigure(8, weight=1)# 初始状态self.current_image = Noneself.on_input_type_changed(None)def on_input_type_changed(self, event):"""根据输入类型更改UI状态"""input_type = self.input_type.get()self.input_text.delete(1.0, tk.END)self.file_path_var.set("")if input_type == "文件":self.input_text.config(state=tk.DISABLED)self.file_button.config(state=tk.NORMAL)self.status_var.set("请选择要生成二维码的文件")else:self.input_text.config(state=tk.NORMAL)self.file_button.config(state=tk.DISABLED)if input_type == "文本":self.input_text.insert(tk.END, "请输入要生成二维码的文本...")self.status_var.set("请输入要生成二维码的文本")elif input_type == "网址":self.input_text.insert(tk.END, "https://")self.status_var.set("请输入要生成二维码的网址")def select_file(self):"""打开文件选择对话框"""file_path = filedialog.askopenfilename()if file_path:self.file_path_var.set(file_path)self.status_var.set(f"已选择文件: {os.path.basename(file_path)}")def update_size_label(self, event):"""更新大小标签显示"""size = self.size_var.get()self.size_label.config(text=str(size))def update_border_label(self, event):"""更新边框标签显示"""border = self.border_var.get()self.border_label.config(text=str(border))def choose_bg_color(self):"""选择背景颜色"""color = colorchooser.askcolor(initialcolor=self.bg_color_var.get(), title="选择背景颜色")if color[1]:  # 如果用户选择了颜色self.bg_color_var.set(color[1])self.bg_color_display.config(background=color[1])def get_error_correction_level(self):"""获取对应的纠错级别"""level_map = {"": qrcode.constants.ERROR_CORRECT_L,"中等": qrcode.constants.ERROR_CORRECT_M,"": qrcode.constants.ERROR_CORRECT_Q,"最高": qrcode.constants.ERROR_CORRECT_H}return level_map[self.error_correction.get()]def generate_qrcode(self):"""生成二维码"""try:input_type = self.input_type.get()if input_type == "文件":file_path = self.file_path_var.get()if not file_path:messagebox.showerror("错误", "请选择一个文件")returntry:with open(file_path, 'r', encoding='utf-8') as file:data = file.read()if len(data) == 0:messagebox.showerror("错误", "文件内容为空")returnexcept Exception as e:messagebox.showerror("错误", f"无法读取文件: {str(e)}")returnelse:data = self.input_text.get(1.0, tk.END).strip()if not data:messagebox.showerror("错误", "输入内容不能为空")returnif input_type == "网址" and not data.startswith(('http://', 'https://')):messagebox.showwarning("警告", "网址应当以 'http://' 或 'https://' 开头")data = "https://" + data# 生成二维码qr = qrcode.QRCode(version=1,error_correction=self.get_error_correction_level(),box_size=10,border=self.border_var.get()  # 使用用户设置的边框大小
            )qr.add_data(data)qr.make(fit=True)# 创建图片,使用用户选择的背景颜色bg_color = self.bg_color_var.get()img = qr.make_image(fill_color="black", back_color=bg_color)# 调整图片大小size = self.size_var.get()img = img.resize((size, size), Image.LANCZOS)# 显示二维码self.current_image = ImageTk.PhotoImage(img)self.qr_label.config(image=self.current_image)self.save_button.config(state=tk.NORMAL)self.status_var.set("二维码生成成功")except Exception as e:messagebox.showerror("错误", f"生成二维码失败: {str(e)}")self.status_var.set("生成二维码失败")def save_qrcode(self):"""保存二维码图片"""if self.current_image is None:messagebox.showerror("错误", "没有生成的二维码可保存")returnfile_path = filedialog.asksaveasfilename(defaultextension=".png",filetypes=[("PNG 文件", "*.png"), ("JPEG 文件", "*.jpg"), ("所有文件", "*.*")])if file_path:try:# 从 PhotoImage 获取原始的 PIL 图像并保存img = self.current_image._PhotoImage__photoimg.write(file_path, format=os.path.splitext(file_path)[1][1:].upper())self.status_var.set(f"二维码已保存至: {file_path}")messagebox.showinfo("成功", f"二维码已成功保存至:\n{file_path}")except Exception as e:messagebox.showerror("错误", f"保存二维码失败: {str(e)}")self.status_var.set("保存二维码失败")if __name__ == "__main__":root = tk.Tk()# 设置主题style = ttk.Style()if 'clam' in style.theme_names():style.theme_use('clam')# 创建自定义样式style.configure('Accent.TButton', font=("SimHei", 10, "bold"))app = QRCodeGenerator(root)root.mainloop()

 

http://www.jsqmd.com/news/555319/

相关文章:

  • 3种场景解决Windows Git安装困境:从卡顿到流畅的镜像部署指南
  • Android窗口同步的幕后功臣:BLASTSyncEngine源码逐行解析与实战避坑
  • 别再手动画图了!用Python+AutoCAD二次开发,5分钟搞定AI辅助设计原型
  • 告别官方驱动:深入解读ES7210寄存器,打造你自己的ESP32音频采集库
  • 深度解析数据库工程与SQL调优:从架构设计到查询性能飞跃
  • 聊聊2026年上海有实力的摄影培训机构,怎么选择不踩坑 - 工业推荐榜
  • DelphiMVCFramework:打造高性能RESTful与JSON-RPC双引擎API的终极解决方案
  • 探索直流微电网混合储能:MPPT、模型预测控制与PI控制的奇妙融合
  • 我把DeepSeek调教成了我的‘专属文案总监’:角色扮演Prompt的实战配置手册
  • 【单片机实战】从外部中断到串口通信:构建一个简易的按键计数与数据回传系统
  • OpenPose终极指南:10分钟掌握人体姿态估计核心技术
  • 高级litecli技巧:7个实用命令提升数据库操作效率
  • Maestro移动测试自动化成长路径:从零基础到专家的完整技能图谱
  • 2026年北京靠谱拆迁律所推荐,企业厂房拆迁律所排名揭晓 - mypinpai
  • 快速搭建MiroFish群体智能预测引擎:4种实战部署方案详解
  • 北京守嘉职业技能培训项目清单 - 品牌排行榜单
  • 保姆级教程:一键脚本升级CentOS 7的OpenSSH,我帮你把zlib和openssl的坑都填好了
  • 逆向分析实战:从IDA反编译看bjdctf_2020_babystack的栈溢出漏洞成因与利用
  • M2LOrder模型Mathtype公式编辑器的趣味扩展:为数学证明添加情感注释
  • Sparse Sinkhorn Attention:点云处理中的高效全局注意力机制
  • AnythingtoRealCharacters2511效果惊艳!20组超清动漫→真人转化前后对比图合集
  • 2026年徐州可靠装饰装修公司排行,推荐性价比高的徐州装修公司 - myqiye
  • 终极指南:如何用虚拟手柄驱动解锁Windows游戏新玩法
  • 带挂载的四轴飞行器模型预测控制(MPC) MATLAB实现
  • VisionMaster全局模块实战解析:变量同步、跨设备通信与智能光源调控
  • HoloPart:突破性3D部件智能分割技术
  • 出差党/远程办公必备:用OpenWrt软路由打造你的随身‘家庭办公室’(支持Windows远程唤醒与桌面)
  • nRF52832上电启动全解析:从MBR到Bootloader的跳转机制与寄存器配置
  • TouchGal Galgame社区终极指南:一站式游戏资源管理与交流平台
  • 探寻松原实力强的道路画线公司,本地道路画线电话多少钱 - 工业设备