当前位置: 首页 > article >正文

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


http://www.kler.cn/a/558933.html

相关文章:

  • Java基础常见的面试题(易错!!)
  • QT闲记-状态栏,模态对话框,非模态对话框
  • 485. 最大连续 1 的个数
  • 【CI/CD】Jenkinsfile管理+参数化构建+邮件通知以及Jenkins + SonarQube 代码审查
  • 【数据库维护】如何解决Clickhouse数据库Too many parts报错
  • 当“欲望号街车”遇阻:解锁自由的疯狂选择题
  • 【C语言】指针(5)
  • 回合制文字版格斗游戏(类的运用)
  • 复刻Dummy机械臂保姆教程
  • 二、Spring Framework基础:IoC(控制反转)和DI(依赖注入)
  • 正则表达式常用记录
  • Mac (M1) 本地使用DockerDesktop 安装Kafka,SpringBoot整合Kafka
  • 2024大模型技术全景解构:从开源生态到商业落地的深度博弈
  • 【Java虚拟机】垃圾回收器
  • 【MySQL 一 数据库基础】深入解析 MySQL 的索引(3)
  • 智能交通系统(Intelligent Transportation Systems):智慧城市中的交通革新
  • 光明谷推出AT指令版本的蓝牙音箱SOC 开启便捷智能音频开发新体验
  • 图片爬取案例
  • 基于ffmpeg+openGL ES实现的视频编辑工具-添加滤镜(七)
  • 第二十四周:OpenPose:使用部分亲和场的实时多人2D姿态估计