网站首页 > 技术文章 正文
34.1 项目目标
- 新增 “导出图表” 功能
- 支持生成:
- 收支饼图(收入 vs 支出占比)
- 类别柱状图(各类别金额对比)
- 将图表导出为 PNG 图片 文件
- 管理员可生成所有用户的数据图表,普通用户仅能生成自己的
34.2 使用的库
我们使用 Python 标准可视化库 matplotlib(Tkinter 能很好地配合)。
import matplotlib.pyplot as plt
34.3 导出图表代码
在 BudgetApp 中新增:
def export_charts(self):
"""导出收支图表(PNG 图片)"""
file_path = filedialog.asksaveasfilename(
defaultextension=".png",
filetypes=[("PNG 图片", "*.png")]
)
if not file_path:
return
# 加载数据
if self.role == "user":
self.cursor.execute("SELECT type, category, amount FROM records WHERE user_id=?", (self.user_id,))
else:
self.cursor.execute("SELECT type, category, amount FROM records")
rows = self.cursor.fetchall()
if not rows:
messagebox.showwarning("提示", "没有数据可导出图表")
return
# 统计收入 vs 支出
income = sum(r[2] for r in rows if r[0] == "收入")
expense = sum(r[2] for r in rows if r[0] == "支出")
# 统计类别金额
category_totals = {}
for _, cat, amt in rows:
category_totals[cat] = category_totals.get(cat, 0) + amt
# 绘制图表
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
# 饼图
axes[0].pie([income, expense], labels=["收入", "支出"], autopct="%.1f%%", colors=["#4caf50", "#f44336"])
axes[0].set_title("收入 vs 支出")
# 柱状图
axes[1].bar(category_totals.keys(), category_totals.values(), color="#2196f3")
axes[1].set_title("各类别金额")
axes[1].set_ylabel("金额")
axes[1].tick_params(axis="x", rotation=30)
plt.tight_layout()
try:
plt.savefig(file_path)
plt.close(fig)
messagebox.showinfo("成功", f"图表已导出到 {file_path}")
except Exception as e:
messagebox.showerror("错误", f"导出失败: {e}")
34.4 在界面中加入按钮
在 BudgetApp.__init__ 的操作按钮区增加:
tk.Button(frame_btn, text="导出图表", command=self.export_charts).pack(side=tk.LEFT, padx=10)
34.5 功能演示
- 用户点击 “导出图表”
- 选择 report.png → 程序生成一个包含 两个图表 的 PNG:
- 左边:饼图,显示收入 vs 支出比例
- 右边:柱状图,显示不同类别的支出或收入金额
- 普通用户:只显示自己数据的图表
- 管理员:包含所有用户数据的图表
34.6 小结
- 使用 matplotlib 生成 饼图 + 柱状图,直观展示收支情况
- 支持导出为 PNG 图片,便于分享或打印
- 根据用户权限导出不同范围的数据
猜你喜欢
- 2025-09-21 Python GUI 编程入门教程 第26章:记账本应用升级数据导出CSV/Excel
- 2025-09-21 keras 人工智能之VGGNet神经网络模型训练
- 2025-09-21 Linux下C++程序符号延迟绑定_linux c 延时
- 2025-09-21 NumPy之:多维数组中的线性代数_多维数组可以看作数据元素也是基本线性表的基本线性表
- 2025-09-21 Python 操作 Excel 并进行数据可视化
- 2025-09-21 Python GUI 编程入门教程 第23章:记账本应用升级——收支图表分析
- 2025-09-21 动态链接:共享库如何实现“一次编译,多程序调用执行”?
- 2025-09-21 AI电磁组中的NN到底有什么优势?_aim磁场
- 2025-09-21 用pyhon计算布林线,并用matplotlib绘制(Qwen2.5模型生成)
- 2025-09-21 Python GUI 编程入门教程 第35章:记账本应用升级——月度趋势图
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)