1. 项目概述
作为一名Python开发者,我经常需要记录个人收支情况。市面上的记账软件要么功能过于复杂,要么无法满足个性化需求。于是我用Python的Tkinter库开发了一个轻量级的个人记账应用,今天就来分享这个项目的完整实现过程。
这个记账应用具备以下核心功能:
- 记录每笔收支的金额、分类、日期和备注
- 以表格形式展示历史记录
- 自动计算总收入和总支出
- 生成支出分类的饼状图
- 数据持久化存储到CSV文件
整个项目代码量约200行,适合Python初学者练手,也方便有经验的开发者二次开发。下面我会详细讲解每个功能模块的实现。
2. 开发环境准备
2.1 基础环境配置
首先确保你的开发环境已经安装Python 3.6+版本。我推荐使用PyCharm或VS Code作为开发工具,它们对Python的支持都很完善。
需要安装的核心库:
bash复制pip install tkinter matplotlib
提示:Tkinter是Python的标准GUI库,通常随Python一起安装。如果遇到缺失,在Ubuntu上可以通过
sudo apt-get install python3-tk安装。
2.2 项目目录结构
建议按以下结构组织项目文件:
code复制budget_app/
├── main.py # 主程序文件
├── records.csv # 数据存储文件
├── requirements.txt # 依赖库列表
└── assets/ # 资源文件夹(可选)
├── icons/ # 应用图标
└── styles/ # 样式文件
这种结构清晰明了,便于后期维护和功能扩展。
3. 主界面设计与实现
3.1 初始化主窗口
我们首先创建应用的主窗口:
python复制import tkinter as tk
from tkinter import ttk
# 创建主窗口
root = tk.Tk()
root.title("个人记账本")
root.geometry("800x600") # 比原项目更大的窗口尺寸
root.resizable(True, True) # 允许调整窗口大小
# 设置窗口图标(可选)
try:
root.iconbitmap('assets/icons/app.ico')
except:
pass # 图标文件不存在时忽略
这里有几个改进点:
- 增大了默认窗口尺寸(800x600),显示更多内容
- 添加了窗口可调整大小的选项
- 增加了图标设置(虽然是非必须的)
3.2 输入表单设计
记账应用需要收集以下信息:
- 金额(正数表示收入,负数表示支出)
- 分类(如餐饮、交通等)
- 日期(默认当天)
- 备注(可选)
python复制# 创建输入框架
input_frame = ttk.LabelFrame(root, text="新增记录", padding=10)
input_frame.grid(row=0, column=0, padx=10, pady=10, sticky="nsew")
# 金额输入
ttk.Label(input_frame, text="金额:").grid(row=0, column=0, sticky="w")
amount_var = tk.DoubleVar() # 改为DoubleVar以支持小数
ttk.Entry(input_frame, textvariable=amount_var).grid(row=0, column=1)
# 分类输入(使用下拉框改进)
categories = ["餐饮", "交通", "购物", "娱乐", "住房", "工资", "其他"]
ttk.Label(input_frame, text="分类:").grid(row=1, column=0, sticky="w")
category_var = tk.StringVar()
category_combobox = ttk.Combobox(input_frame, textvariable=category_var, values=categories)
category_combobox.grid(row=1, column=1)
category_combobox.current(0) # 默认选择第一个分类
# 备注输入
ttk.Label(input_frame, text="备注:").grid(row=2, column=0, sticky="w")
note_var = tk.StringVar()
ttk.Entry(input_frame, textvariable=note_var).grid(row=2, column=1)
# 日期输入(使用日期选择器改进)
from tkcalendar import DateEntry # 需要安装tkcalendar库
ttk.Label(input_frame, text="日期:").grid(row=3, column=0, sticky="w")
date_var = tk.StringVar()
date_entry = DateEntry(input_frame, textvariable=date_var, date_pattern='y-mm-dd')
date_entry.grid(row=3, column=1)
改进说明:
- 使用LabelFrame组织输入区域,更美观
- 金额改用DoubleVar支持小数
- 分类改用Combobox下拉选择,避免手动输入错误
- 日期使用专门的DateEntry控件,体验更好
- 所有控件使用ttk版本,外观更现代
4. 数据存储实现
4.1 CSV文件存储设计
我们使用CSV文件存储记账数据,格式如下:
code复制日期,金额,分类,备注
2023-07-15,50.0,餐饮,午餐
2023-07-15,-20.0,交通,地铁
实现数据保存功能:
python复制import csv
from datetime import datetime
import os
DATA_FILE = "records.csv"
def init_data_file():
"""初始化数据文件,如果不存在则创建并写入表头"""
if not os.path.exists(DA
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容