实现一个简易的代办清单,支持新增、修改、删除和查询功能

🎉摘要:Python 是一门解释型、面向对象、动态类型的高级编程语言,由荷兰程序员 Guido van Rossum 于 1991 年发布,核心设计理念是优雅、明确、简单。

该示例将使用前面学习的 Python3 基础知识,实现一个简易版本的代办程序,该代办程序支持新增、修改、删除和查询代办的功能,同时通过 JSON 文件来保存代办数据。

代办清单包含如下功能:

(1)添加待办事项

(2)标记完成 / 未完成

(3)查看全部 / 仅查看未完成

(4)用字符拼接成表格展示

(5)将数据保存到文件中,程序启动时自动读取数据

注意,该示例程序使用了 Python 的 json 和 os 内置模块,其中:

  • json:是 Python 内置标准模块,专门用来处理 JSON 格式数据

  • os:是 Python 内置标准模块,让代码直接和操作系统交互,如文件、路径、文件夹、环境变量等等

示例代码:

import json
import os

class TodoItem:
    """单个待办事项类,存储内容和完成状态"""
    def __init__(self, content: str):
        self.content = content  # 待办内容
        self.is_completed = False  # 完成状态,默认未完成

    def mark_completed(self):
        """标记为已完成"""
        self.is_completed = True

    def mark_incomplete(self):
        """标记为未完成"""
        self.is_completed = False

    def to_dict(self):
        """转为字典,用于保存到文件"""
        return {"content": self.content, "is_completed": self.is_completed}

    @staticmethod
    def from_dict(data):
        """从字典恢复对象,用于读取文件"""
        item = TodoItem(data["content"])
        item.is_completed = data["is_completed"]
        return item


class TodoList:
    """TODO 清单管理类(含持久化、清空、删除)"""
    def __init__(self, save_file="todo_list.json"):
        self.items = []  # 存储所有待办事项
        self.save_file = save_file  # 持久化文件
        self.load_from_file()  # 启动自动加载历史数据

    def add_item(self, content: str):
        """添加新待办事项"""
        if not content.strip():
            print("事项内容不能为空!")
            return
        item = TodoItem(content)
        self.items.append(item)
        self.save_to_file()  # 自动保存
        print(f"已添加事项:{content}")

    def delete_item(self, index: int):
        """删除指定序号的事项"""
        try:
            deleted = self.items.pop(index)
            self.save_to_file()
            print(f"已删除事项:{deleted.content}")
        except IndexError:
            print("无效的事项编号!")

    def clear_all(self):
        """清空所有待办事项"""
        self.items.clear()
        self.save_to_file()
        print("已清空所有待办事项!")

    def mark_item(self, index: int, completed: bool):
        """标记指定索引的事项完成/未完成"""
        try:
            item = self.items[index]
            if completed:
                item.mark_completed()
                print(f"已标记完成:{item.content}")
            else:
                item.mark_incomplete()
                print(f"已标记未完成:{item.content}")
            self.save_to_file()  # 修改后自动保存
        except IndexError:
            print("无效的事项编号!")

    def show_all(self):
        """展示所有事项(表格形式)"""
        self._show_table(filter_completed=None)

    def show_incomplete(self):
        """仅展示未完成事项(表格形式)"""
        self._show_table(filter_completed=False)

    def _show_table(self, filter_completed=None):
        """内部方法:字符表格展示"""
        items_to_show = []
        for idx, item in enumerate(self.items):
            if filter_completed is None:
                items_to_show.append((idx, item))
            elif not item.is_completed:
                items_to_show.append((idx, item))

        if not items_to_show:
            print("暂无待办事项")
            return

        print("-" * 45)
        print(f"{'序号':<5}{'状态':<8}{'内容'}")
        print("-" * 45)
        for idx, item in items_to_show:
            status = "已完成" if item.is_completed else "未完成"
            print(f"{idx:<5}{status:<8}{item.content}")
        print("-" * 45)

    # ==================== 持久化 ====================
    def save_to_file(self):
        """保存数据到 JSON 文件"""
        try:
            data = [item.to_dict() for item in self.items]
            with open(self.save_file, "w", encoding="utf-8") as f:
                json.dump(data, f, ensure_ascii=False, indent=2)
        except Exception as e:
            print(f"保存失败:{e}")

    def load_from_file(self):
        """从文件加载历史数据"""
        if not os.path.exists(self.save_file):
            return
        try:
            with open(self.save_file, "r", encoding="utf-8") as f:
                data_list = json.load(f)
            self.items = [TodoItem.from_dict(d) for d in data_list]
        except Exception as e:
            print(f"加载历史数据失败:{e}")


def main():
    """主程序:命令行交互"""
    todo = TodoList()
    while True:
        print("\n===== 功能菜单 =====")
        print("1. 添加待办事项")
        print("2. 标记事项为已完成")
        print("3. 标记事项为未完成")
        print("4. 查看所有事项")
        print("5. 查看未完成事项")
        print("6. 删除单个事项")
        print("7. 清空所有事项")
        print("0. 退出程序")

        choice = input("请输入操作编号:").strip()
        if choice == "1":
            content = input("请输入待办内容:")
            todo.add_item(content)

        elif choice == "2":
            idx = input("请输入要标记完成的事项序号:")
            if idx.isdigit():
                todo.mark_item(int(idx), completed=True)
            else:
                print("请输入有效数字!")

        elif choice == "3":
            idx = input("请输入要标记未完成的事项序号:")
            if idx.isdigit():
                todo.mark_item(int(idx), completed=False)
            else:
                print("请输入有效数字!")

        elif choice == "4":
            todo.show_all()

        elif choice == "5":
            todo.show_incomplete()

        elif choice == "6":
            idx = input("请输入要删除的事项序号:")
            if idx.isdigit():
                todo.delete_item(int(idx))
            else:
                print("请输入有效数字!")

        elif choice == "7":
            confirm = input("确定要清空所有事项吗?(y/n):")
            if confirm.lower() == "y":
                todo.clear_all()
            else:
                print("已取消清空")

        elif choice == "0":
            print("退出程序,数据已自动保存")
            break

        else:
            print("无效操作,请重新输入!")


if __name__ == "__main__":
    main()

运行结果:

===== 功能菜单 =====
1. 添加待办事项
2. 标记事项为已完成
3. 标记事项为未完成
4. 查看所有事项
5. 查看未完成事项
6. 删除单个事项
7. 清空所有事项
0. 退出程序
请输入操作编号:1
请输入待办内容:学习python编程
已添加事项:学习python编程

===== 功能菜单 =====
1. 添加待办事项
2. 标记事项为已完成
3. 标记事项为未完成
4. 查看所有事项
5. 查看未完成事项
6. 删除单个事项
7. 清空所有事项
0. 退出程序
请输入操作编号:4
---------------------------------------------
序号   状态      内容
---------------------------------------------
0    未完成     学习python编程
---------------------------------------------

===== 功能菜单 =====
1. 添加待办事项
2. 标记事项为已完成
3. 标记事项为未完成
4. 查看所有事项
5. 查看未完成事项
6. 删除单个事项
7. 清空所有事项
0. 退出程序
请输入操作编号:1
请输入待办内容:学习AI基础知识
已添加事项:学习AI基础知识

===== 功能菜单 =====
1. 添加待办事项
2. 标记事项为已完成
3. 标记事项为未完成
4. 查看所有事项
5. 查看未完成事项
6. 删除单个事项
5. 查看未完成事项
6. 删除单个事项
6. 删除单个事项
7. 清空所有事项
0. 退出程序
请输入操作编号:5
---------------------------------------------
序号   状态      内容
---------------------------------------------
0    未完成     学习python编程
1    未完成     学习AI基础知识
---------------------------------------------

===== 功能菜单 =====
1. 添加待办事项
2. 标记事项为已完成
3. 标记事项为未完成
4. 查看所有事项
5. 查看未完成事项
6. 删除单个事项
7. 清空所有事项
0. 退出程序
请输入操作编号:0
退出程序,数据已自动保存

  





说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号