首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python GUI 项目实战:用 Tkinter 打造一个桌面记账软件

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

原创
作者头像
用户11690571
发布2025-06-10 09:34:46
发布2025-06-10 09:34:46
47100
代码可运行
举报
运行总次数:0
代码可运行

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


一、项目简介

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

  • 表单输入界面
  • 表格数据展示
  • 数据本地保存(CSV/SQLite)
  • 收支统计与汇总

📌 本项目特点:

  • 界面美观简洁,适配常见桌面系统
  • 支持输入“日期 / 类型 / 金额 / 备注”
  • 实时显示所有记录并支持删除
  • 自动汇总支出与收入金额

二、Tkinter 简介

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

  • 跨平台(Windows / macOS / Linux)
  • 内置于 Python 中(无需额外安装)
  • 支持基本控件(按钮、输入框、表格)

三、项目结构设计

代码语言:javascript
代码运行次数:0
运行
复制
bash复制编辑📂my_budget_app
├── main.py         # 主程序
├── data.csv        # 记账数据(自动生成)
└── assets/         # 可放图标或样式

四、界面布局与控件设计

1. 基本布局逻辑

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

代码语言:javascript
代码运行次数:0
运行
复制
python复制编辑import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import csv
import os
from datetime import datetime

2. 输入区界面代码

代码语言:javascript
代码运行次数:0
运行
复制
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 文件

代码语言:javascript
代码运行次数:0
运行
复制
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. 添加记录的按钮

代码语言:javascript
代码运行次数:0
运行
复制
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 表格展示数据。

代码语言:javascript
代码运行次数:0
运行
复制
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)

加载并展示数据

代码语言:javascript
代码运行次数:0
运行
复制
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)

七、删除选中记录

代码语言:javascript
代码运行次数:0
运行
复制
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()

八、汇总显示区

代码语言:javascript
代码运行次数:0
运行
复制
python复制编辑total_label = tk.Label(root, text="总收入:0 元    总支出:0 元", font=("Arial", 12), fg="blue")
total_label.pack(pady=10)

九、启动主程序

代码语言:javascript
代码运行次数:0
运行
复制
python复制编辑show_records()
root.mainloop()

十、完整运行效果图

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


十一、功能拓展建议

拓展功能

实现方式

图表统计收支

使用 matplotlib

月度报表导出

自动生成 Excel 文件

用户登录/切换账户

Tkinter 多窗口 + SQLite

界面主题切换

ttk.Style / dark mode

云端同步

Dropbox/OneDrive API


十二、总结

通过本项目,你将掌握:

  • 使用 Tkinter 创建图形界面
  • 表单输入与表格展示控件使用
  • 本地数据保存与读取
  • GUI 项目的完整封装逻辑

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、项目简介
  • 二、Tkinter 简介
  • 三、项目结构设计
  • 四、界面布局与控件设计
    • 1. 基本布局逻辑
    • 2. 输入区界面代码
  • 五、数据添加与保存逻辑
    • 1. 保存到 CSV 文件
    • 2. 添加记录的按钮
  • 六、展示历史记录
    • 加载并展示数据
  • 七、删除选中记录
  • 八、汇总显示区
  • 九、启动主程序
  • 十、完整运行效果图
  • 十一、功能拓展建议
  • 十二、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档