#创作灵感#
想要生成一个二维码🐴需要找各种小程序,还得看一些烦人的广告,作为一个自由度较高的程序员,我想到了自己做一个企业级二维码/条码生成器。使用 PyQt5 + Python 打造功能完整的二维码生成工具,支持 7 种数据类型、样式定制、批量生成和历史记录管理。本文没办法给出所有代码,会贴出全部关键代码,若是想要全部的工程项目以及安装包,可以留言。好的,现在开始进入正文,讲述整个项目的所有关键步骤。
📌 引言
在日常开发和企业应用中,二维码/条码生成是一个高频需求。无论是产品溯源、活动签到、WiFi 连接,还是名片分享,都离不开二维码。市面上虽然有众多在线生成工具,但大多存在以下痛点:
-
❌ 需要上传数据到云端,存在隐私泄露风险
-
❌ 生成的二维码有时效性,过期后无法使用
-
❌ 功能单一,不支持批量生成和样式定制
-
❌ 无法保存生成历史,重复劳动
基于以上问题,我决定开发一款企业级的二维码/条码生成器,完全本地运行,数据不上传,支持 7 种数据类型,具备完善的样式定制和记录管理功能。
本文将从需求分析、技术选型、架构设计到核心实现,完整记录整个开发过程,希望能为有类似需求的开发者提供参考。先来看界面图:

🎯 需求分析
核心功能需求
经过详细的需求调研,我整理了以下核心功能:
| 数据类型 | URL、WiFi、vCard、Email、SMS、Location、Text 共 7 种 |
| 生成方式 | 静态 QR Code,永不过期,无需注册,100% 本地生成 |
| 输出格式 | 支持 SVG 与 PNG 两种格式 |
| 样式定制 | 自定义前景色/背景色、背景图、Logo 水印 |
| 条码支持 | 同时生成 Code128、EAN-13 等多种条码 |
| 数据持久化 | 使用 SQLite 保存生成记录,支持历史查询和重新编辑 |
| 批量生成 | 支持 CSV/Excel 导入,批量生成二维码 |
| 导出功能 | 支持 CSV、JSON、Excel 格式导出记录 |
| 界面主题 | 多种主题样式,控件比例协调美观 |
技术选型
根据需求,我选择了以下技术栈:
┌─────────────────────────────────────────────────────────┐
│ 技术架构图 │
├─────────────────────────────────────────────────────────┤
│ 前端界面 │ PyQt5 (桌面应用) │
│ 二维码生成 │ qrcode + Pillow │
│ 条码生成 │ python-barcode │
│ 数据存储 │ SQLAlchemy + SQLite │
│ 数据处理 │ Pandas + OpenPyXL │
│ 打包部署 │ PyInstaller + Inno Setup │
│ 版本控制 │ Python 3.11 + pip │
└─────────────────────────────────────────────────────────┘
为什么要选择这些技术?
-
PyQt5:成熟的桌面应用框架,跨平台支持好,组件丰富
-
qrcode + Pillow:Python 社区最成熟的二维码生成方案
-
SQLAlchemy:强大的 ORM 框架,简化数据库操作
-
SQLite:轻量级嵌入式数据库,无需额外部署
-
Pandas:数据处理能力强,方便批量操作和导出
🏗️ 项目架构设计
目录结构
项目采用分层架构,清晰的模块划分便于维护和扩展:
qrcode-generator/
├── src/
│ ├── __init__.py
│ ├── main.py # 程序入口
│ ├── core/ # 核心业务层
│ │ ├── __init__.py
│ │ ├── qr_generator.py # 二维码生成器
│ │ └── barcode_generator.py # 条码生成器
│ ├── database/ # 数据层
│ │ ├── __init__.py
│ │ ├── db_manager.py # 数据库管理器
│ │ └── models.py # 数据模型
│ ├── ui/ # 界面层
│ │ ├── __init__.py
│ │ ├── main_window.py # 主窗口
│ │ ├── dialogs.py # 对话框
│ │ └── styles.py # 主题样式
│ └── utils/ # 工具层
│ ├── __init__.py
│ └── helpers.py # 通用工具函数
├── resources/ # 资源文件
│ ├── icons/ # 图标
│ └── themes/ # 主题
├── requirements.txt # 依赖清单
├── run.py # 启动脚本
├── build.bat # 构建脚本
└── installer.iss # 安装脚本
注:若是嫌弃建立一个一个的文件、文件夹麻烦,可以使用之前我写在文章里的项目结构管理器进行建立,一次性生成一整个项目。附上链接:
项目结构管理器:打造高效的项目结构管理工具-CSDN博客
模块职责
┌─────────────────────────────────────────────────────────────┐
│ 用户界面层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ MainWindow │ │ Dialogs │ │ ThemeManager │ │
│ │ 主窗口 │ │ 对话框 │ │ 主题管理 │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ 业务逻辑层 ││
│ │ ┌─────────────────┐ ┌───────────────────────────┐ ││
│ │ │ QRGenerator │ │ BarcodeGenerator │ ││
│ │ │ 二维码生成器 │ │ 条码生成器 │ ││
│ │ └─────────────────┘ └───────────────────────────┘ ││
│ └─────────────────────────────────────────────────────────┘│
│ ↓ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ 数据持久层 ││
│ │ ┌─────────────────┐ ┌───────────────────────────┐ ││
│ │ │ DatabaseManager│ │ QRCodeRecord (Model) │ ││
│ │ │ 数据库管理器 │ │ 数据模型 │ ││
│ │ └─────────────────┘ └───────────────────────────┘ ││
│ └─────────────────────────────────────────────────────────┘│
│ ↓ │
│ SQLite 数据库文件 │
└─────────────────────────────────────────────────────────────┘
💻 核心代码实现
1. 数据库模型设计
首先设计数据库模型,用于存储二维码生成记录:
from sqlalchemy import Column, Integer, String, DateTime, Text, LargeBinary
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime
Base = declarative_base()
class QRCodeRecord(Base):
__tablename__ = 'qr_codes'
id = Column(Integer, primary_key=True, autoincrement=True)
content = Column(Text, nullable=False) # 二维码内容
qr_type = Column(String(50)) # 数据类型
qr_image_path = Column(String(500)) # 图片路径
qr_image_data = Column(LargeBinary) # 图片二进制数据
settings = Column(Text) # JSON格式配置
created_at = Column(DateTime, default=datetime.now)
usage_count = Column(Integer, default=0) # 使用次数统计
设计思路:
-
使用 LargeBinary 存储图片数据,实现数据备份和恢复
-
settings 字段存储 JSON 格式的样式配置,灵活扩展
-
usage_count 用于统计使用频率,便于数据分析
2. 二维码生成核心
二维码生成器的核心实现:
import qrcode
from PIL import Image
import io
class QRGenerator:
def generate_qr(self, content, qr_type='Text', **kwargs):
# 1. 解析不同类型的内容
parsed_content = self._parse_content(content, qr_type)
# 2. 创建 QRCode 实例
qr = qrcode.QRCode(
version=kwargs.get('size', 6),
error_correction=qrcode.constants.ERROR_CORRECT_M,
box_size=10,
border=kwargs.get('border', 2),
)
qr.add_data(parsed_content)
qr.make(fit=True)
# 3. 生成图片
img = qr.make_image(
fill_color=kwargs.get('foreground_color', '#000000'),
back_color=kwargs.get('background_color', '#FFFFFF')
)
# 4. 添加 Logo(如果有)
if kwargs.get('logo_path'):
img = self._add_logo(img, kwargs['logo_path'])
# 5. 转换为二进制数据
img_bytes = io.BytesIO()
img.save(img_bytes, format='PNG')
return {
'data': img_bytes.getvalue(),
'content': parsed_content,
'type': qr_type
}
关键点解析:
-
_parse_content 方法根据不同类型(WiFi、vCard 等)生成符合标准的 QR Code 内容
-
支持自定义颜色和 Logo 添加
-
返回二进制数据,便于预览和保存

3. 数据库管理器
数据库管理器的核心 CRUD 操作:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
class DatabaseManager:
def __init__(self, db_path='qrcode_data.db'):
self.engine = create_engine(f'sqlite:///{db_path}')
self.Session = sessionmaker(bind=self.engine)
def save_record(self, content, qr_type, qr_image_data, settings=None):
session = self.Session()
try:
record = QRCodeRecord(
content=content,
qr_type=qr_type,
qr_image_data=qr_image_data,
settings=json.dumps(settings) if settings else None
)
session.add(record)
session.commit()
return record.id
finally:
session.close()
def list_records(self, page=1, page_size=20, search=None):
session = self.Session()
try:
query = session.query(QRCodeRecord)
if search:
query = query.filter(QRCodeRecord.content.contains(search))
total = query.count()
records = query.order_by(
QRCodeRecord.created_at.desc()
).offset((page-1)*page_size).limit(page_size).all()
return {'total': total, 'records': records}
finally:
session.close()
4. 主窗口界面
主窗口使用 PyQt5 构建,布局清晰美观:
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.db_manager = DatabaseManager()
self.qr_generator = QRGenerator()
self.init_ui()
def init_ui(self):
# 设置窗口属性
self.setWindowTitle("企业级二维码/条码生成器 v2.0")
self.setGeometry(100, 100, 1400, 800)
# 创建左右分栏布局
left_panel = self.create_left_panel() # 输入和设置
right_panel = self.create_right_panel() # 预览和记录
# 布局管理
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QHBoxLayout(central_widget)
layout.addWidget(left_panel, 2)
layout.addWidget(right_panel, 3)
# 应用主题
self.apply_theme('default')
def generate_qr(self):
"""生成二维码的核心逻辑"""
content = self.content_edit.toPlainText().strip()
if not content:
QMessageBox.warning(self, "警告", "请输入内容")
return
# 收集配置参数
config = {
'qr_type': self.type_combo.currentText(),
'size': int(self.size_combo.currentText()),
'foreground_color': self.get_foreground_color(),
'background_color': self.get_background_color(),
}
# 调用生成器
result = self.qr_generator.generate_qr(content, **config)
# 显示预览
self.display_preview(result['data'])
5. 主题管理
支持多主题切换,提升用户体验:
class ThemeManager:
def __init__(self):
self.themes = {
'default': """
QMainWindow { background-color: #f0f0f0; }
QPushButton {
background-color: #4CAF50;
color: white;
border: none;
padding: 8px 16px;
border-radius: 4px;
}
QPushButton:hover { background-color: #45a049; }
""",
'dark': """
QMainWindow { background-color: #2b2b2b; }
QLabel { color: #eee; }
QPushButton {
background-color: #4CAF50;
color: white;
border: none;
padding: 8px 16px;
border-radius: 4px;
}
""",
'blue': """
QMainWindow { background-color: #e8f4f8; }
QPushButton {
background-color: #2196F3;
color: white;
border: none;
padding: 8px 16px;
border-radius: 4px;
}
"""
}
def get_theme(self, name):
return self.themes.get(name, self.themes['default'])

🎨 界面展示
主界面布局
┌──────────────────────────────────────────────────────────────────┐
│ 企业级二维码/条码生成器 v2.0 [─][□][×] │
├──────────────────────────────────────────────────────────────────┤
│ 📁 文件 ✏️ 编辑 👁️ 视图 🛠️ 工具 ❓ 帮助 │
├──────────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌──────────────────────────────────────────┐ │
│ │ 数据类型 │ │ 预览区域 │ │
│ │ [URL ▼] │ │ ┌──────────────────────────────────┐ │ │
│ │ │ │ │ │ │ │
│ │ 内容 │ │ │ 二维码预览 │ │ │
│ │ ┌──────────┐ │ │ │ │ │ │
│ │ │请输入内容 │ │ │ └──────────────────────────────────┘ │ │
│ │ └──────────┘ │ │ │ │
│ │ │ │ ☑ 同时生成条码 │ │
│ │ 样式设置 │ ├──────────────────────────────────────────┤ │
│ │ 大小:[6 ▼] │ │ 历史记录 │ │
│ │ 前景色:[■] │ │ ┌────────────────────────────────────┐ │ │
│ │ 背景色:[■] │ │ │ ID │ 类型 │ 内容 │ 时间 │ 使用次数 │ │ │
│ │ 背景图:[浏览]│ │ │ 1 │ URL │ htt… │ 2024…│ 5 │ │ │
│ │ Logo:[浏览] │ │ │ 2 │ WiFi │ SSI… │ 2024…│ 3 │ │ │
│ │ │ │ │ 3 │ vCar…│ FN:… │ 2024…│ 2 │ │ │
│ │ [生成二维码] │ │ └────────────────────────────────────┘ │ │
│ │ [保存] [清空] │ │ ◀ 第 1 页 / 共 10 页 ▶ │ │
│ └─────────────┘ └──────────────────────────────────────────┘ │
├──────────────────────────────────────────────────────────────────┤
│ 就绪 状态栏 │
└──────────────────────────────────────────────────────────────────┘
📦 打包与部署
使用 PyInstaller 打包
创建 QRCodeGenerator.spec 配置文件:
a = Analysis(
['run.py'],
pathex=[],
binaries=[],
datas=[('resources', 'resources')],
hiddenimports=[
'PyQt5.sip',
'sqlalchemy',
'qrcode',
'PIL',
'barcode',
'pandas',
'openpyxl',
'reportlab',
],
excludes=['tkinter', 'test', 'unittest'],
)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
name='QRCodeGenerator',
console=False, # 不显示控制台
icon='resources/icons/app_icon.ico',
)
coll = COLLECT(
exe,
a.binaries,
a.datas,
name='QRCodeGenerator',
)
使用 Inno Setup 制作安装程序
[Setup]
AppName=企业级二维码/条码生成器
AppVersion=2.0.0
DefaultDirName={pf}\\QRCodeGenerator
DefaultGroupName=二维码生成器
OutputBaseFilename=QRCodeGenerator_Setup
SetupIconFile=resources\\icons\\app_icon.ico
Compression=lzma2
SolidCompression=yes
[Files]
Source: "dist\\QRCodeGenerator\\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs
[Icons]
Name: "{commondesktop}\\二维码生成器"; Filename: "{app}\\QRCodeGenerator.exe"
Name: "{group}\\二维码生成器"; Filename: "{app}\\QRCodeGenerator.exe"
[Run]
Filename: "{app}\\QRCodeGenerator.exe"; Description: "启动二维码生成器"; Flags: postinstall nowait
🚀 快速开始
环境要求
-
Python 3.11 或更高版本
-
Windows 10/11(或 Linux/macOS)
安装步骤
# 1. 克隆项目
git clone https://github.com/yourusername/qrcode-generator.git
cd qrcode-generator
# 2. 创建虚拟环境
python -m venv venv
source venv/bin/activate # Linux/macOS
# 或
venv\\Scripts\\activate # Windows
# 3. 安装依赖
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 4. 运行程序
python run.py
# 5. 打包(可选)
pyinstaller QRCodeGenerator.spec
📊 功能演示
支持的 7 种数据类型
| URL | https://example.com | 直接跳转链接 |
| WiFi | SSID:MyWiFi,Password:12345678 | WiFi 连接配置 |
| vCard | FN:张三\\nTEL:13800138000 | 电子名片 |
| to:test@example.com,subject:Hello | 邮件模板 | |
| SMS | to:13800138000,message:您好 | 短信模板 |
| Location | lat:39.9,lng:116.4 | 地理位置 |
| Text | 任意文本内容 | 纯文本 |
批量生成功能
支持 CSV/Excel 导入,批量生成二维码:
# CSV 文件格式示例
content,type
https://example.com,URL
SSID:MyWiFi,Password:12345678,WiFi
FN:张三,TEL:13800138000,vCard
网硕互联帮助中心


评论前必须登录!
注册