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

用PySide6+SQLite3开发一个本地化个人记账软件(附完整源码和打包教程)

用PySide6+SQLite3开发一个本地化个人记账软件(附完整源码和打包教程)

记账这件事,说大不大,说小不小。每次月底看着银行卡余额发懵的时候,才后悔没把每一笔开销记录下来。市面上的记账App要么功能臃肿,要么隐私堪忧。作为一个Python开发者,为什么不自己动手打造一个专属的记账工具?本文将带你用PySide6和SQLite3从零构建一个轻量级本地记账应用,最后还会教你怎么打包成可执行文件分享给朋友。

1. 环境准备与项目初始化

工欲善其事,必先利其器。在开始编码前,我们需要准备好开发环境。推荐使用Python 3.9+版本,太新的Python版本可能会遇到一些库兼容性问题。

安装必要的库:

pip install PySide6

创建项目目录结构:

/personal_finance /ui # 存放界面设计文件 /database # 数据库相关 /images # 图标等资源 main.py # 程序入口

初始化SQLite3数据库表结构。我们至少需要三张表:

  1. 交易记录表:存储每笔收支的详细信息
  2. 分类表:预设支出/收入分类
  3. 账户表:记录银行卡、支付宝等账户余额
# database/init_db.py import sqlite3 def init_database(): conn = sqlite3.connect('finance.db') cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS transactions ( id INTEGER PRIMARY KEY AUTOINCREMENT, amount REAL NOT NULL, type TEXT CHECK(type IN ('income', 'expense')), category_id INTEGER, account_id INTEGER, date TEXT DEFAULT CURRENT_DATE, description TEXT, FOREIGN KEY (category_id) REFERENCES categories(id), FOREIGN KEY (account_id) REFERENCES accounts(id) ) ''') # 其他表结构省略... conn.commit() conn.close()

2. 设计主界面与核心功能

PySide6提供了丰富的UI组件,我们可以用QMainWindow作为主窗口框架。左侧使用QTreeWidget展示功能导航,右侧用QStackedWidget实现多页面切换。

主界面应包含以下核心区域

  • 顶部状态栏:显示当前月份和总收支
  • 中间主体:交易记录表格(QTableView)和统计图表
  • 底部操作区:添加/删除/修改记录的按钮
# ui/main_window.py from PySide6.QtWidgets import QMainWindow, QVBoxLayout, QWidget class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("个人记账本") self.resize(1000, 600) # 创建中心部件 central_widget = QWidget() self.setCentralWidget(central_widget) # 主布局 main_layout = QVBoxLayout() central_widget.setLayout(main_layout) # 添加其他UI组件... self.setup_ui() def setup_ui(self): # 具体UI实现代码 pass

提示:使用QSS可以轻松美化界面。创建一个单独的style.qss文件,然后在代码中加载:

with open('ui/style.qss', 'r') as f: app.setStyleSheet(f.read())

3. 实现交易记录管理

交易记录是记账软件的核心。我们需要实现以下功能点:

  • 添加新交易(支持快捷键操作)
  • 批量导入银行流水
  • 按条件筛选和搜索
  • 数据校验与错误处理

交易添加表单的关键代码

# ui/transaction_form.py from PySide6.QtWidgets import QDialog, QFormLayout class TransactionForm(QDialog): def __init__(self, parent=None): super().__init__(parent) self.setup_ui() def setup_ui(self): layout = QFormLayout(self) # 金额输入框 self.amount_input = QLineEdit() self.amount_input.setValidator(QDoubleValidator(0, 999999, 2)) layout.addRow("金额:", self.amount_input) # 类型选择 self.type_combo = QComboBox() self.type_combo.addItems(["支出", "收入"]) layout.addRow("类型:", self.type_combo) # 其他表单字段... # 按钮组 buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) layout.addRow(buttons)

交易记录表格使用QTableView与SQL模型

# ui/transaction_table.py from PySide6.QtSql import QSqlTableModel class TransactionTable(QTableView): def __init__(self): super().__init__() self.model = QSqlTableModel() self.model.setTable("transactions") self.model.select() self.setModel(self.model) self.setSelectionBehavior(QTableView.SelectRows) self.setEditTriggers(QTableView.NoEditTriggers) # 设置列宽和标题 self.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.model.setHeaderData(1, Qt.Horizontal, "金额") self.model.setHeaderData(2, Qt.Horizontal, "类型") # 其他列设置...

4. 数据统计与可视化

单纯的数字列表不够直观,我们需要用图表展示消费趋势。PySide6本身没有内置图表库,但可以集成Matplotlib或PyQtGraph。

月度消费统计实现

# utils/chart.py import matplotlib.pyplot as plt from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg class MonthlyChart(FigureCanvasQTAgg): def __init__(self, parent=None): self.fig, self.ax = plt.subplots(figsize=(8, 4)) super().__init__(self.fig) self.setParent(parent) def update_chart(self, data): """ data格式: {'categories': [], 'amounts': []} """ self.ax.clear() self.ax.bar(data['categories'], data['amounts']) self.ax.set_title("本月消费分布") self.ax.set_ylabel("金额") self.draw()

常用统计指标计算

指标名称SQL查询示例说明
月度总支出SELECT SUM(amount) FROM transactions...计算指定月份总支出
消费分类占比SELECT category, SUM(amount) FROM...按分类统计支出比例
账户余额变动SELECT account, SUM(CASE WHEN...) FROM...跟踪各账户资金流动

5. 数据备份与导出

本地存储的数据需要定期备份。我们可以实现:

  • 自动备份(每天首次启动时)
  • 手动导出为Excel/CSV
  • 打印报表功能

数据库备份实现

# utils/backup.py import shutil from datetime import datetime def backup_database(): timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") backup_file = f"backup/finance_{timestamp}.db" shutil.copy2('finance.db', backup_file) return backup_file

导出为CSV的代码示例

# utils/export.py import csv def export_to_csv(filename, start_date, end_date): conn = sqlite3.connect('finance.db') cursor = conn.cursor() query = """ SELECT date, type, amount, description FROM transactions WHERE date BETWEEN ? AND ? ORDER BY date DESC """ cursor.execute(query, (start_date, end_date)) with open(filename, 'w', newline='') as f: writer = csv.writer(f) writer.writerow(['日期', '类型', '金额', '说明']) # 表头 writer.writerows(cursor.fetchall()) conn.close()

6. 打包与分发

开发完成后,我们可以使用PyInstaller将应用打包成可执行文件,方便在没有Python环境的电脑上运行。

打包配置

# build.spec a = Analysis( ['main.py'], datas=[('ui/*.qss', 'ui'), ('images/*', 'images')], hiddenimports=[], hookspath=[], runtime_hooks=[], ) pyz = PYZ(a.pure) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, name='PersonalFinance', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, runtime_tmpdir=None, console=False, # 设置为True可显示控制台窗口 icon='images/app.ico')

打包命令:

pyinstaller --onefile --windowed --icon=app.ico main.py

注意:如果使用了Matplotlib等库,可能需要额外添加hiddenimports。遇到打包问题时,可以先用--debug all参数查看详细日志。

7. 功能扩展思路

基础版本完成后,可以考虑添加以下增强功能:

  • 多用户支持:使用密码保护个人财务数据
  • 预算管理:设置月度预算并提醒超支
  • 定期交易:自动记录房租、工资等固定收支
  • 数据同步:通过WebDAV实现多设备同步
  • 报表生成:自动生成月度/年度财务报告

预算提醒实现示例

# features/budget.py from PySide6.QtWidgets import QMessageBox class BudgetMonitor: def __init__(self): self.monthly_budget = 5000 # 默认预算 def check_budget(self): spent = self.get_monthly_spending() if spent > self.monthly_budget * 0.8: QMessageBox.warning( None, "预算提醒", f"本月已支出{spent}元,超过预算的80%!" ) def get_monthly_spending(self): # 查询数据库获取当月支出总额 pass

8. 项目结构与源码组织

良好的代码结构能让项目更易维护。建议采用以下组织方式:

/personal_finance /core # 核心业务逻辑 database.py models.py /ui # 用户界面 main_window.py dialogs/ transaction_dialog.py /utils # 工具函数 chart.py backup.py /resources # 资源文件 style.qss icons/ main.py # 程序入口 requirements.txt

关键依赖关系

  • main.py导入ui.main_window
  • ui.main_window导入core.databaseutils.chart
  • 各对话框独立封装,通过信号与主窗口通信

9. 遇到的典型问题与解决方案

在开发过程中,我踩过几个坑值得分享:

  1. 数据库连接泄漏

    • 现象:长时间使用后程序变慢甚至崩溃
    • 解决:使用上下文管理器确保连接关闭
    from contextlib import contextmanager @contextmanager def get_db_connection(): conn = sqlite3.connect('finance.db') try: yield conn finally: conn.close()
  2. 界面卡顿

    • 现象:加载大量交易记录时UI无响应
    • 解决:使用分页加载和后台线程
    class LoadThread(QThread): loaded = Signal(list) def run(self): # 在后台执行数据库查询 with get_db_connection() as conn: cursor = conn.cursor() cursor.execute("SELECT * FROM transactions LIMIT 100 OFFSET ?", (page * 100,)) self.loaded.emit(cursor.fetchall())
  3. 打包后资源丢失

    • 现象:打包后的exe找不到qss文件和图标
    • 解决:使用sys._MEIPASS处理资源路径
    def resource_path(relative_path): if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, relative_path) return os.path.join(os.path.abspath("."), relative_path)

10. 进一步学习资源

想深入掌握PySide6开发,可以参考:

  • 官方文档:Qt for Python
  • 书籍推荐
    • 《PySide6从入门到实践》
    • 《Python GUI编程 with Qt》
  • 开源项目
    • QGIS:使用Qt的大型GIS软件
    • Orange3:数据可视化工具

开发过程中最实用的技巧是善用Qt Designer设计界面,然后使用pyside6-uic命令转换为Python代码。对于复杂界面,这比纯手写布局效率高得多。

http://www.cnnetsun.cn/news/2214000.html

相关文章:

  • UnityRuntimeInspector源码深度解析:探索InspectorField与HierarchyData的设计奥秘
  • Simple-Web-Server 性能优化终极指南:10个提升吞吐量的实用技巧
  • 跨模态RAG技术:多模态检索增强生成框架解析
  • VSCode数据库客户端:一站式管理MySQL、PostgreSQL、Redis等7大数据库
  • pynput性能优化实战:提升自动化脚本执行效率
  • LarkMidTable企业级应用案例:智慧校园、智慧金融等场景解析
  • VSCode数据库客户端安全配置:SSH隧道与数据加密终极指南
  • 实战演练:基于快马平台将蓝桥杯模拟银行叫号赛题开发为可部署应用
  • 终极指南:如何在Vim中使用syntastic实现Kotlin语法检查
  • 深度学习完全指南:从神经元到卷积网络,一文读懂AI的大脑
  • Cogito 3B部署教程:低成本GPU显存优化方案|Ollama镜像免配置实操
  • Code Interpreter SDK 终极指南:为AI应用注入代码执行能力
  • 手写一个 ReAct,彻底搞懂 Agent 是怎么“思考”的
  • Agent 生产级可靠性生存指南
  • Bug考古学:系统化调试复杂遗留代码的核心技能与实战指南
  • TensorFlow 2.x分布式策略失效?PyTorch DDP多进程死锁?20年踩过的17个分布式训练“静默故障”清单(附可复现Notebook)
  • 基于Gemini与工作流引擎的AI代码生成系统构建指南
  • RAPTOR框架:四旋翼无人机零样本智能控制技术解析
  • MosaicMem:视频预测中的记忆模块创新与应用
  • 在多地域部署服务中体验Taotoken路由能力对稳定性的提升
  • LinkSwift:八大网盘直链解析工具终极指南,告别下载限速烦恼
  • 大语言模型计数能力解析与优化实践
  • MotionStream:实时视频生成框架的技术解析与应用
  • 从单口到四口:基于Xilinx FPGA的10G UDP多网卡方案设计与资源开销全解析(KU060/KU5P/ZU9EG实测)
  • 基于模型预测控制MPC和神经网络相结合的两电平三相逆变器控制研究(Matlab代码实现)
  • GPT-SoVITS如何通过1分钟语音数据实现专业级语音克隆?探索开源语音合成技术的颠覆性突破
  • 2025年VR交互设备深度测评:这4大权威避坑指南必看!
  • 告别微信文件传输助手:用群晖NAS和Vocechat搭建一个永不丢失的私人聊天室(附Cpolar内网穿透教程)
  • 多智能体强化学习在物流分拣中的优化实践
  • 分类树方法(CTM)在软件测试中的应用与实践