优秀的编程知识分享平台

网站首页 > 技术文章 正文

Python GUI 编程入门教程 第38章 记账本应用升级前10大额支出排行榜

nanyue 2025-09-21 20:11:39 技术文章 2 ℃

38.1 项目目标

  1. 新增 “导出Top 10支出排行榜” 功能
  2. 使用柱状图展示金额最高的 10 笔支出
  3. 普通用户仅能查看自己的,管理员可查看所有用户的数据
  4. 支持导出为 PNG 图片

38.2 数据准备

我们只筛选 支出 记录,并按金额排序,取前 10 条。


38.3 实现 Top 10 支出排行榜

在 BudgetApp 中新增:

def export_top10_expenses(self):
    """导出Top 10大额支出排行榜"""
    file_path = filedialog.asksaveasfilename(
        defaultextension=".png",
        filetypes=[("PNG 图片", "*.png")]
    )
    if not file_path:
        return

    # 获取支出数据
    if self.role == "user":
        self.cursor.execute("SELECT category, amount, date FROM records WHERE user_id=? AND type='支出' ORDER BY amount DESC LIMIT 10", (self.user_id,))
    else:
        self.cursor.execute("SELECT category, amount, date FROM records WHERE type='支出' ORDER BY amount DESC LIMIT 10")

    rows = self.cursor.fetchall()
    if not rows:
        messagebox.showwarning("提示", "没有支出数据可导出图表")
        return

    # 转换为 DataFrame
    df = pd.DataFrame(rows, columns=["category", "amount", "date"])

    # 生成展示标签:类别+日期
    df["label"] = df["category"] + " (" + df["date"] + ")"

    # 绘制柱状图(横向,避免标签重叠)
    fig, ax = plt.subplots(figsize=(8, 6))
    ax.barh(df["label"], df["amount"], color="#f44336")
    ax.set_title("Top 10 大额支出排行榜")
    ax.set_xlabel("金额")
    ax.invert_yaxis()  # 让最大支出显示在最上方

    plt.tight_layout()
    try:
        plt.savefig(file_path)
        plt.close(fig)
        messagebox.showinfo("成功", f"Top 10 大额支出排行榜已导出到 {file_path}")
    except Exception as e:
        messagebox.showerror("错误", f"导出失败: {e}")

38.4 在界面中加入按钮

在 BudgetApp.__init__ 的操作按钮区增加:

tk.Button(frame_btn, text="导出Top10支出排行榜", command=self.export_top10_expenses).pack(side=tk.LEFT, padx=10)

38.5 功能演示

  1. 用户点击 “导出Top 10支出排行榜”
  2. 程序查询最大 10 笔支出,并生成柱状图
  3. 导出的 top10_expenses.png 图片:
  4. 横向柱状图,从最大金额到最小排序
  5. Y 轴:类别 + 日期(如 “购物 (2025-08-10)”)
  6. X 轴:金额
  7. 红色柱子强调支出
  8. 普通用户:仅展示个人 Top10
  9. 管理员:展示所有用户的 Top10

38.6 小结

  • 使用 横向柱状图 展示最大支出,更直观
  • 帮助用户快速识别异常支出或大额消费
  • 管理员可用于整体消费分析

Tags:

最近发表
标签列表