Python项目源码33:待办事项列表应用2.0(命令行界面+Json+类)

---------★Python练手项目源码★--------

Python项目32:订单销售额管理系统1.0(Tkinter+CSV)

Python项目31:初学者也能看懂的聊天机器人1.0源码(命令行界面+Re正则表达式)

Python项目源码30:待办事项列表应用1.0(命令行界面+Json+类+初学者必做)

Python项目29:学生缴费管理系统(Tkinter+CSV)

Python项目28:设计日志管理系统2.0(Tkinter+Json)

Python项目27:用Tkinter写日志管理系统(中下等难度)

Python项目26:设计学生成绩管理系统(简易版)

Python项目25:带滚动效果的商场抽奖系统(安排!!!)

Python项目24:基于Tkinter图形化界面,实现的学生课堂点名系统

Python项目23:(简易版)年会员工抽奖程序

Python项目22:一个简单的记账系统(收入+支出+查询)

Python项目21:双色球历史数据爬虫+数据分析小工具
新增功能说明:
1.任务分类系统:预定义工作/生活/学习三大分类,添加任务时强制选择分类,支持按分类筛选任务。
2.四级优先级体系:高/中/低三级优先级,影响任务排序和显示顺序,优先级图标系统(可用符号表示)。
3.智能搜索功能:def search_tasks(self): # 支持多条件组合搜索 # 包括关键词、分类、优先级 # 返回匹配任务的详细视图。

4.截止日期管理:def _input_due_date(self): # 日期格式验证(YYYY-MM-DD) # 自动拒绝过去日期 # 在任务视图中突出显示临近截止的任务。

5.多维排序系统:def sort_tasks(self): # 支持四种排序方式: # 1. 截止日期(升序/降序) # 2. 优先级(高优先) # 3. 创建时间(新旧顺序) # 排序后自动刷新任务列表。

代码运行后的效果在这里插入图片描述

# -*- coding: utf-8 -*-
# @Author : 小红牛
# 微信公众号:WdPython
import json
import os
from datetime import datetime

class EnhancedTodoList:
    def __init__(self, filename="tasks.json"):
        self.filename = filename
        self.categories = ["工作", "生活", "学习"]
        self.priorities = {"高": 3, "中": 2, "低": 1}
        self.tasks = self._load_tasks()

    # region 核心方法
    def _load_tasks(self):
        """加载任务列表并转换日期"""
        if os.path.exists(self.filename):
            with open(self.filename, "r", encoding='utf-8') as f:
                tasks = json.load(f)
                for task in tasks:
                    # 转换日期字段
                    if task.get('due_date'):
                        task['due_date'] = datetime.strptime(task['due_date'], '%Y-%m-%d')
                    if task.get('created_at'):
                        task['created_at'] = datetime.strptime(task['created_at'], '%Y-%m-%d %H:%M:%S')
                return tasks
        return []

    def _save_tasks(self):
        """保存任务列表并处理日期序列化"""
        save_data = []
        for task in self.tasks:
            temp_task = task.copy()
            # 转换所有datetime对象为字符串
            if temp_task.get('due_date') and isinstance(temp_task['due_date'], datetime):
                temp_task['due_date'] = temp_task['due_date'].strftime('%Y-%m-%d')
            if temp_task.get('created_at') and isinstance(temp_task['created_at'], datetime):
                temp_task['created_at'] = temp_task['created_at'].strftime('%Y-%m-%d %H:%M:%S')
            save_data.append(temp_task)
        # 中文json字段
        with open(self.filename, "w", encoding='utf-8') as f:
            json.dump(save_data, f, indent=2, ensure_ascii=False)


    # region 用户界面
    def _show_menu(self):
        """显示主菜单"""
        print("\n=== 增强版待办事项列表 ===")
        print("1. 添加新任务")
        print("2. 查看所有任务")
        print("3. 标记任务为已完成")
        print("4. 删除任务")
        print("5. 搜索任务")
        print("6. 排序任务")
        print("7. 保存并退出")

    def _show_sort_menu(self):
        """显示排序菜单"""
        print("\n排序方式:")
        print("1. 按截止日期升序(即将到期优先)")
        print("2. 按截止日期降序")
        print("3. 按优先级降序(高优先先显示)")
        print("4. 按创建时间升序(旧任务先显示)")

    # endregion

    # region 任务操作
    def add_task(self):
        """添加新任务"""
        task = {
            "name": input("请输入任务内容: ").strip(),
            "category": self._select_category(),
            "priority": self._select_priority(),
            "due_date": self._input_due_date(),
            "completed": False,
            "created_at": datetime.now()
        }

        if not task["name"]:
            print("任务内容不能为空!")
            return

        self.tasks.append(task)
        print(f"已添加任务: {task['name']}")

    def complete_task(self):
        """标记任务为已完成"""
        if not self.tasks:
            print("当前没有任务!")
            return

        self.show_tasks()
        try:
            task_num = int(input("请输入要标记完成的任务序号: "))
            if 1 <= task_num <= len(self.tasks):
                self.tasks[task_num - 1]["completed"] = True
                print("任务标记为已完成!")
            else:
                print("无效的任务序号!")
        except ValueError:
            print("请输入有效的数字!")

    def delete_task(self):
        """删除任务"""
        if not self.tasks:
            print("当前没有任务!")
            return

        self.show_tasks()
        try:
            task_num = int(input("请输入要删除的任务序号: "))
            if 1 <= task_num <= len(self.tasks):
                removed = self.tasks.pop(task_num - 1)
                print(f"已删除任务: {removed['name']}")
            else:
                print("无效的任务序号!")
        except ValueError:
            print("请输入有效的数字!")

    # endregion

    # region 新增功能
    def search_tasks(self):
        """任务搜索功能"""
        keyword = input("输入搜索关键词(留空则忽略): ").lower()
        category = self._select_category(include_all=True)
        priority = self._select_priority(include_all=True)

        results = []
        for task in self.tasks:
            # 匹配关键词
            if keyword and keyword not in task["name"].lower():
                continue

            # 匹配分类
            if category != "全部" and task["category"] != category:
                continue

            # 匹配优先级
            if priority != "全部" and task["priority"] != priority:
                continue

            results.append(task)

        self._display_tasks(results)

    def sort_tasks(self):
        """任务排序"""
        self._show_sort_menu()
        choice = input("请选择排序方式: ").strip()

        sort_options = {
            "1": (lambda x: x["due_date"] or datetime.max, False),
            "2": (lambda x: x["due_date"] or datetime.min, True),
            "3": (lambda x: self.priorities.get(x["priority"], 0), True),
            "4": (lambda x: x["created_at"], False)
        }

        if choice in sort_options:
            sort_key, reverse = sort_options[choice]
            self.tasks.sort(key=sort_key, reverse=reverse)
            print("任务已排序!")
            self.show_tasks()
        else:
            print("无效的排序选项!")

    # endregion

    # region 工具方法
    def _select_category(self, include_all=False):
        """选择分类"""
        print("\n任务分类:")
        options = self.categories.copy()
        if include_all:
            options = ["全部"] + options

        for i, cat in enumerate(options, 1):
            print(f"{i}. {cat}")

        while True:
            try:
                choice = int(input("请选择分类: "))
                if 1 <= choice <= len(options):
                    return options[choice - 1]
                print("无效的选择!")
            except ValueError:
                print("请输入数字!")

    def _select_priority(self, include_all=False):
        """选择优先级"""
        print("\n任务优先级:")
        options = list(self.priorities.keys())
        if include_all:
            options = ["全部"] + options

        for i, pri in enumerate(options, 1):
            print(f"{i}. {pri}")

        while True:
            try:
                choice = int(input("请选择优先级: "))
                if 1 <= choice <= len(options):
                    return options[choice - 1]
                print("无效的选择!")
            except ValueError:
                print("请输入数字!")

    def _input_due_date(self):
        """输入截止日期"""
        while True:
            date_str = input("请输入截止日期(YYYY-MM-DD,留空可跳过): ").strip()
            if not date_str:
                return None

            try:
                due_date = datetime.strptime(date_str, "%Y-%m-%d")
                if due_date.date() < datetime.now().date():
                    print("截止日期不能早于今天!")
                    continue
                return due_date
            except ValueError:
                print("日期格式不正确,请使用YYYY-MM-DD格式!")

    def _display_tasks(self, tasks):
        """显示任务列表"""
        if not tasks:
            print("没有找到匹配的任务!")
            return

        print("\n我的任务列表:")
        for i, task in enumerate(tasks, 1):
            status = "已完成" if task["completed"] else " "
            due_date = task["due_date"].strftime("%Y-%m-%d") if task["due_date"] else "无"
            created_at = task["created_at"].strftime("%Y-%m-%d %H:%M")
            print(f"{i}. [{status}] {task['name']}")
            print(f"   # 分类:{task['category']} | 优先级:{task['priority']}")
            print(f"   # 截止日期:{due_date} | 创建时间:{created_at}")
            print("-" * 50)

    # endregion

    # region 主程序
    def show_tasks(self):
        """显示所有任务"""
        self._display_tasks(self.tasks)

    def run(self):
        """运行主程序"""
        while True:
            self._show_menu()
            choice = input("请选择操作 (1-7): ").strip()

            actions = {
                "1": self.add_task,
                "2": self.show_tasks,
                "3": self.complete_task,
                "4": self.delete_task,
                "5": self.search_tasks,
                "6": self.sort_tasks,
                "7": self._exit_program
            }

            if choice in actions:
                actions[choice]()
                if choice == "7":
                    break
            else:
                print("无效的输入,请选择1-7之间的数字!")

    def _exit_program(self):
        """安全退出程序"""
        self._save_tasks()
        print("任务已保存,感谢使用!")

if __name__ == "__main__":
    app = EnhancedTodoList()
    app.run()

完毕!!感谢您的收看

----------★★跳转到历史博文集合★★----------

我的零基础Python教程,Python入门篇 进阶篇 视频教程 Py安装py项目 Python模块 Python爬虫 Json Xpath 正则表达式 Selenium Etree CssGui程序开发 Tkinter Pyqt5 列表元组字典数据可视化 matplotlib 词云图 Pyecharts 海龟画图 Pandas Bug处理 电脑小知识office自动化办公 编程工具 NumPy Pygame

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值