还在为红包收支烦恼?一行代码解决你的春节经济危机!
春节将至,红包战争一触即发!收红包一时爽,记账火葬场。给侄子500,侄女600,舅舅给1000,阿姨给800...等等,我到底收了多少?花了多少?谁给的多?该还多少人情?
作为程序员的我,被这个问题困扰多年后,终于决定——自己写个程序搞定它!今天就把这个红包管理神器分享给大家,附完整代码,手把手教你打造专属于自己的春节财务管家!
一、痛点直击:你的红包烦恼,我都懂!
先来个灵魂拷问:
去年春节,你净收入还是净支出?
给不同亲戚孩子的红包金额合理吗?
哪些亲戚给的红包最大方?
人情往来中,你最“亏”的是谁?
如果这些问题让你头皮发麻,恭喜你,本文就是为你量身定制的!
二、神器亮相:我的红包管理软件长这样!
先上成果图,让你看看这个工具多强大:
(想象一下:红包记录表单、明细表格、精美的收支饼图,所有数据一目了然!)
这个工具能做到:
智能记账:收入支出分类记录,支持自定义类别
关系管理:记录发/收对象及亲属关系
实时统计:自动计算总收入、总支出、净余额
可视化分析:自动生成收支分布饼图
数据导出:一键导出Excel,永久保存
最重要的是——它完全免费,代码开源,你可以随意修改!money哥为大家呕心沥血的真心啊
三、框架剖析:看看程序员如何“优雅”记账
核心架构:三个模块搞定复杂需求
# 1. 数据层:SQLite数据库存储class RedPacketManager: def create_table(self): """创建红包记录表""" # 包含日期、类型、类别、金额、对象、关系、备注七大字段 # 设计精巧,满足所有记账需求! def load_data(self): """智能加载与统计""" # 自动计算各种统计数据 # 月度分析、人员统计、分类汇总一气呵成
亮点功能揭秘:这些设计太贴心了!
亮点1:智能分类联动
def on_type_changed(self, event=None): """选择‘收入’或‘支出’时,自动切换对应类别""" # 收入:压岁钱、红包、礼物折算、其他收入 # 支出:给晚辈、给长辈、人情往来、其他支出 # 逻辑清晰,防止记错账!
亮点2:人情关系网络
# 不只是记账,更是人情账本!person_stats = { "张三": {"income": 1000, "expense": 500, "relationship": "舅舅"}, "李四": {"income": 800, "expense": 600, "relationship": "阿姨"} # 谁欠你人情,你欠谁人情,一目了然!}
亮点3:可视化报表
def update_charts(self): """自动生成专业饼图""" # 收入分布图(左) # 支出分布图(右) # 颜色鲜艳,支持中文,年会上展示都够用!
四、使用教程:手把手教你运行代码
第一步:准备环境(超级简单!)
# 只需安装三个库pip install tkinter # 界面库(通常已内置)pip install matplotlib # 图表库pip install pandas # 数据处理库
第二步:复制完整代码
第三步:运行程序
叮咚! 你的专属红包管理器启动成功!
第四步:开始记账(示例)
假设春节当天:
收姨妈红包:点击“添加记录”
日期:自动当天
类型:收入
类别:红包(自动选项)
金额:1000
对象:张阿姨
关系:亲戚
备注:新年快乐!
给侄子红包:再点“添加记录”
类型切换为“支出”
类别自动变为“给晚辈”
金额:600
对象:小明
关系:家人
查看成果:右侧立即显示统计和图表!
五、核心代码解读
1. 数据库设计:简洁高效
def create_table(self): cursor = self.conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS red_packets ( id INTEGER PRIMARY KEY AUTOINCREMENT, date TEXT NOT NULL, type TEXT NOT NULL, category TEXT NOT NULL, amount REAL NOT NULL, person TEXT NOT NULL, relationship TEXT NOT NULL, note TEXT ) ''') self.conn.commit()
我们使用SQLite数据库,它是一个轻量级的嵌入式数据库,非常适合桌面应用。表结构设计包含8个字段,其中id是自增主键,date记录日期,type区分收入支出,category是具体类别,amount是金额,person是红包对象,relationship是关系,note是备注。这样的设计可以满足红包记录的所有需求。
2. 数据统计:使用defaultdict自动初始化
from collections import defaultdict# 在load_data方法中self.category_income = defaultdict(float)self.category_expense = defaultdict(float)self.monthly_stats = defaultdict(lambda: {"income": 0, "expense": 0})
defaultdict是Python的一个神器,它允许我们为字典设置默认值。这样在统计时,如果键不存在,会自动创建并初始化为0,避免了繁琐的判断和初始化代码。
3. GUI布局:tkinter的灵活运用
def setup_gui(self): # 创建标题框架 title_frame = tk.Frame(self.root, bg="#FF6B6B", height=80) title_frame.pack(fill=tk.X) title_frame.pack_propagate(False) # 创建主内容框架,分为左右两部分 main_frame = tk.Frame(self.root, bg="#FFF0F0") main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) left_frame = tk.Frame(main_frame, bg="#FFF0F0") left_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=(0, 5)) right_frame = tk.Frame(main_frame, bg="#FFF0F0") right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=(5, 0))
我们使用tkinter进行GUI设计。界面分为标题、左侧输入和统计区域、右侧记录和图表区域。通过Frame的嵌套和pack布局管理器,实现了界面的灵活布局。注意,我们使用了pack_propagate(False)来固定标题框架的高度,否则框架会根据内容自动调整。
4. 表格显示:ttk.Treeview的使用
self.tree = ttk.Treeview(table_frame, columns=columns, show="headings", height=15)
ttk.Treeview是tkinter中用于显示表格的控件,我们设置show="headings"来显示表头,并定义列名。然后为每一列设置宽度和对齐方式。通过tag_configure为收入(绿色)和支出(红色)设置不同的颜色,使表格更加直观。
5. 图表绘制:matplotlib与tkinter的结合
# 创建图表fig = Figure(figsize=(8, 4), dpi=80, facecolor="#FFF9F9")ax1 = fig.add_subplot(121)ax1.pie(income_sizes, labels=income_labels, autopct='%1.1f%%', colors=colors, startangle=90)ax1.set_title('收入类别分布', fontproperties="SimHei")# 嵌入到Tkintercanvas = FigureCanvasTkAgg(fig, master=self.chart_canvas_frame)canvas.draw()canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)
我们使用matplotlib绘制饼图,并通过FigureCanvasTkAgg将图表嵌入到tkinter界面中。注意,我们设置了中文字体(SimHei)以正常显示中文标题。图表背景色与界面背景色一致,保持整体协调。
6. 事件驱动:类型改变自动更新类别
def on_type_changed(self, event=None): record_type = self.entries["type"].get() if record_type == "收入": categories = ["压岁钱", "红包", "礼物折算", "其他收入"] else: categories = ["给晚辈", "给长辈", "人情往来", "其他支出"] self.entries["category"].config(values=categories)
当用户在组合框中选择不同的类型(收入或支出)时,会触发on_type_changed事件,然后自动更新类别组合框的选项。这样设计避免了用户选择错误类别,提升了用户体验。
7. 数据导出:使用pandas生成Excel
def export_to_excel(self): # 从数据库读取数据 cursor = self.conn.cursor() cursor.execute("SELECT date, type, category, amount, person, relationship, note FROM red_packets") rows = cursor.fetchall() # 创建DataFrame df = pd.DataFrame(rows, columns=["日期", "类型", "类别", "金额", "对象", "关系", "备注"]) # 保存到Excel with pd.ExcelWriter(filename, engine='openpyxl') as writer: df.to_excel(writer, sheet_name='红包记录', index=False)
我们使用pandas库将数据库中的数据导出到Excel。pandas的DataFrame可以很方便地将数据转换为表格形式,并且支持直接写入Excel文件。我们创建了两个工作表,一个存放详细记录,一个存放汇总数据。
8. 面向对象设计:将功能封装在类中
整个程序被封装在一个RedPacketManager类中,这样可以将数据和方法组织在一起,结构清晰,也便于扩展和维护。例如,如果需要添加新的功能,只需在类中添加新的方法即可。
通过以上解读,相信你对代码有了更深入的理解。这个项目虽然不大,但涵盖了数据库操作、GUI编程、数据可视化、文件导出等多个方面,是一个很好的Python实战项目。
效果视频
六、不只是工具:这是你的人情“数据库”
这个程序最大的价值不是记账,而是:
建立你的人情档案:谁对你大方?你对谁大方?优化社交策略:钱要花在刀刃上,人情要还给对的人传承家庭记忆:5年后回看,这是温暖的春节记忆培养财务意识:从小红包开始,学会管理大财务
七、程序员思维:如何用代码解决生活问题、
这个项目展示了程序员的核心优势:
发现问题:红包记账混乱
分析需求:需要记录、统计、分析、可视化
设计架构:数据库+界面+图表
迭代优化:根据使用反馈添加新功能
这个春节,让我们用程序员的方式,优雅地管理红包,科学地经营人情!完整代码获取:关注公众号后在公众号后台回复「红包管理软件」获取完整源代码文件,下载到本地电脑用Python环境运行!
分享不易,扫码关注、点赞、点在看,支持一下吧