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