Python GUI 项目实战:用 Tkinter 打造一个桌面记账软件

150 阅读3分钟

本文将手把手教你用 Python 内置的 GUI 工具 Tkinter 开发一个完整的桌面记账应用,从界面布局到数据保存,实现一个真正可用的小工具。

一、项目简介

记账应用是很多人入门 GUI 编程的首选项目,它涉及:

  • 表单输入界面

  • 表格数据展示

  • 数据本地保存(CSV/SQLite)

  • 收支统计与汇总

📌 本项目特点:

  • 界面美观简洁,适配常见桌面系统

  • 支持输入“日期 / 类型 / 金额 / 备注”

  • 实时显示所有记录并支持删除

  • 自动汇总支出与收入金额

二、Tkinter 简介

Tkinter 是 Python 官方推荐的 GUI 编程工具,具备以下优点:

  • 跨平台(Windows / macOS / Linux)

  • 内置于 Python 中(无需额外安装)

  • 支持基本控件(按钮、输入框、表格)

三、项目结构设计

bash复制编辑📂my_budget_app
├── main.py         # 主程序
├── data.csv        # 记账数据(自动生成)
└── assets/         # 可放图标或样式

四、界面布局与控件设计

1. 基本布局逻辑

采用“上方输入区 + 中部表格 + 下方汇总信息”布局。

python复制编辑import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import csv
import os
from datetime import datetime

2. 输入区界面代码

python复制编辑root = tk.Tk()
root.title("我的记账本")
root.geometry("700x500")

# 输入区 Frame
input_frame = tk.Frame(root)
input_frame.pack(pady=10)

tk.Label(input_frame, text="日期(YYYY-MM-DD):").grid(row=0, column=0)
date_entry = tk.Entry(input_frame)
date_entry.grid(row=0, column=1)

tk.Label(input_frame, text="类型:").grid(row=0, column=2)
type_var = tk.StringVar()
type_box = ttk.Combobox(input_frame, textvariable=type_var)
type_box["values"] = ("收入", "支出")
type_box.grid(row=0, column=3)

tk.Label(input_frame, text="金额:").grid(row=1, column=0)
amount_entry = tk.Entry(input_frame)
amount_entry.grid(row=1, column=1)

tk.Label(input_frame, text="备注:").grid(row=1, column=2)
note_entry = tk.Entry(input_frame)
note_entry.grid(row=1, column=3)

五、数据添加与保存逻辑

1. 保存到 CSV 文件

python复制编辑DATA_FILE = "data.csv"

def save_data(date, type_, amount, note):
    with open(DATA_FILE, "a", newline="", encoding="utf-8") as f:
        writer = csv.writer(f)
        writer.writerow([date, type_, amount, note])

2. 添加记录的按钮

python复制编辑def add_record():
    date = date_entry.get()
    type_ = type_box.get()
    amount = amount_entry.get()
    note = note_entry.get()
    
    if not (date and type_ and amount):
        messagebox.showwarning("提示", "请填写完整信息")
        return
    
    save_data(date, type_, amount, note)
    show_records()
    clear_inputs()

tk.Button(input_frame, text="添加记录", command=add_record).grid(row=2, column=1, columnspan=2, pady=10)

六、展示历史记录

使用 ttk.Treeview 表格展示数据。

python复制编辑columns = ("日期", "类型", "金额", "备注")
table = ttk.Treeview(root, columns=columns, show="headings")
for col in columns:
    table.heading(col, text=col)
    table.column(col, width=100)
table.pack(pady=10)

加载并展示数据

python复制编辑def show_records():
    for row in table.get_children():
        table.delete(row)
    
    income_total = 0
    expense_total = 0
    
    if os.path.exists(DATA_FILE):
        with open(DATA_FILE, "r", encoding="utf-8") as f:
            reader = csv.reader(f)
            for row in reader:
                table.insert("", tk.END, values=row)
                if row[1] == "收入":
                    income_total += float(row[2])
                elif row[1] == "支出":
                    expense_total += float(row[2])
    
    total_label.config(text=f"总收入:{income_total:.2f} 元    总支出:{expense_total:.2f} 元")

def clear_inputs():
    date_entry.delete(0, tk.END)
    amount_entry.delete(0, tk.END)
    note_entry.delete(0, tk.END)

七、删除选中记录

python复制编辑def delete_selected():
    selected = table.selection()
    if not selected:
        return
    
    values = table.item(selected[0])["values"]
    if messagebox.askyesno("确认删除", f"确认删除:{values}?"):
        with open(DATA_FILE, "r", encoding="utf-8") as f:
            rows = list(csv.reader(f))
        with open(DATA_FILE, "w", newline="", encoding="utf-8") as f:
            writer = csv.writer(f)
            for row in rows:
                if row != list(values):
                    writer.writerow(row)
        show_records()

tk.Button(root, text="删除选中记录", command=delete_selected).pack()

八、汇总显示区

python复制编辑total_label = tk.Label(root, text="总收入:0 元    总支出:0 元", font=("Arial", 12), fg="blue")
total_label.pack(pady=10)

九、启动主程序

python复制编辑show_records()
root.mainloop()

十、完整运行效果图

📷 记账应用界面效果示意图:

十一、功能拓展建议

拓展功能

实现方式

图表统计收支

使用 matplotlib

月度报表导出

自动生成 Excel 文件

用户登录/切换账户

Tkinter 多窗口 + SQLite

界面主题切换

ttk.Style / dark mode

云端同步

Dropbox/OneDrive API

十二、总结

通过本项目,你将掌握:

  • 使用 Tkinter 创建图形界面

  • 表单输入与表格展示控件使用

  • 本地数据保存与读取

  • GUI 项目的完整封装逻辑

📌 适合作为初中级 Python 学习者的桌面开发入门实战项目!