编程世界充满了无限可能,而从零开始打造一个属于自己的小程序项目,是开启这段旅程最有趣的方式之一。本文将带你一步步完成一个简单但功能完整的“个人待办事项管理器”小程序项目。这个项目不仅实用,还能让你掌握编程的核心概念,如变量、函数、条件判断、循环和数据存储等。我们将使用Python语言,因为它语法简洁、易于上手,非常适合初学者。
项目概述:为什么选择“待办事项管理器”?
待办事项管理器是一个经典且实用的项目。它能帮助你管理日常任务,同时让你练习基本的编程技能。通过这个项目,你将学习:
- 用户交互:如何从用户那里获取输入。
- 数据存储:如何保存和读取任务数据。
- 逻辑控制:如何添加、删除、标记完成任务。
- 错误处理:如何让程序更健壮。
我们将使用Python的内置库,无需安装额外工具,确保项目简单易行。
第一步:环境准备
在开始编码之前,确保你的电脑上安装了Python。你可以从Python官网下载最新版本(推荐Python 3.8或更高)。安装后,打开终端(Windows上是命令提示符或PowerShell,Mac/Linux上是Terminal),输入以下命令验证安装:
python --version
如果显示类似Python 3.9.7的版本信息,说明安装成功。接下来,创建一个项目文件夹,例如todo_app,并在其中创建一个名为main.py的文件。你可以使用任何文本编辑器(如VS Code、Sublime Text或甚至记事本)来编写代码。
第二步:设计程序结构
一个简单的待办事项管理器应该包含以下功能:
- 显示菜单:让用户选择操作(添加任务、查看任务、标记完成、删除任务、退出)。
- 添加任务:输入任务描述并保存。
- 查看任务:列出所有任务,包括完成状态。
- 标记完成:将任务标记为已完成。
- 删除任务:移除指定任务。
- 数据持久化:将任务保存到文件中,以便下次启动时加载。
我们将使用一个列表来存储任务,每个任务是一个字典,包含description(描述)和completed(完成状态)。数据将保存到一个文本文件中,使用JSON格式,因为它易于读写。
第三步:编写代码
现在,让我们开始编写代码。我们将逐步构建程序,每个部分都附有详细解释和示例。
1. 导入必要的库
首先,导入json库用于处理数据存储,以及os库用于检查文件是否存在。
import json
import os
2. 定义数据文件路径
我们将任务数据保存在tasks.json文件中。定义一个变量来存储文件路径,这样便于管理。
DATA_FILE = "tasks.json"
3. 加载现有任务
创建一个函数来从文件中加载任务。如果文件不存在,则返回一个空列表。
def load_tasks():
"""从JSON文件加载任务列表"""
if os.path.exists(DATA_FILE):
with open(DATA_FILE, 'r') as file:
try:
return json.load(file)
except json.JSONDecodeError:
return [] # 文件为空或损坏时返回空列表
return []
解释:
os.path.exists(DATA_FILE)检查文件是否存在。with open(DATA_FILE, 'r') as file以只读模式打开文件。json.load(file)将JSON数据解析为Python列表。- 如果文件为空或格式错误,捕获异常并返回空列表。
4. 保存任务到文件
创建一个函数将任务列表保存到JSON文件。
def save_tasks(tasks):
"""将任务列表保存到JSON文件"""
with open(DATA_FILE, 'w') as file:
json.dump(tasks, file, indent=4) # indent=4 使文件更易读
解释:
json.dump(tasks, file, indent=4)将Python对象转换为JSON格式并写入文件。indent=4添加缩进,使文件可读性更好。
5. 显示菜单
创建一个函数显示用户菜单,并获取用户选择。
def show_menu():
"""显示主菜单并返回用户选择"""
print("\n=== 待办事项管理器 ===")
print("1. 添加任务")
print("2. 查看任务")
print("3. 标记任务完成")
print("4. 删除任务")
print("5. 退出")
choice = input("请输入选项 (1-5): ")
return choice
解释:
- 使用
print函数显示菜单选项。 input函数获取用户输入,返回字符串。
6. 添加任务
创建一个函数处理添加任务。
def add_task(tasks):
"""添加新任务"""
description = input("请输入任务描述: ").strip()
if description:
tasks.append({"description": description, "completed": False})
print("任务添加成功!")
else:
print("任务描述不能为空!")
解释:
input获取任务描述,.strip()去除首尾空格。- 如果描述非空,添加一个字典到任务列表,
completed初始为False。 - 否则,提示错误。
7. 查看任务
创建一个函数显示所有任务。
def view_tasks(tasks):
"""显示所有任务"""
if not tasks:
print("当前没有任务。")
return
print("\n=== 任务列表 ===")
for i, task in enumerate(tasks, 1):
status = "✓" if task["completed"] else "✗"
print(f"{i}. [{status}] {task['description']}")
解释:
enumerate(tasks, 1)遍历任务列表,从1开始编号。- 使用三元运算符
if task["completed"] else "✗"显示完成状态。 f-string格式化输出,使显示清晰。
8. 标记任务完成
创建一个函数标记任务为完成。
def mark_task_completed(tasks):
"""标记任务为完成"""
if not tasks:
print("没有任务可标记。")
return
view_tasks(tasks) # 先显示任务列表
try:
task_num = int(input("请输入要标记的任务编号: "))
if 1 <= task_num <= len(tasks):
tasks[task_num - 1]["completed"] = True
print("任务标记为完成!")
else:
print("无效的任务编号。")
except ValueError:
print("请输入有效的数字。")
解释:
- 首先调用
view_tasks显示任务,方便用户选择。 - 使用
try-except处理输入错误(如非数字输入)。 - 检查编号是否在有效范围内,然后更新
completed状态。
9. 删除任务
创建一个函数删除任务。
def delete_task(tasks):
"""删除任务"""
if not tasks:
print("没有任务可删除。")
return
view_tasks(tasks)
try:
task_num = int(input("请输入要删除的任务编号: "))
if 1 <= task_num <= len(tasks):
removed_task = tasks.pop(task_num - 1)
print(f"已删除任务: {removed_task['description']}")
else:
print("无效的任务编号。")
except ValueError:
print("请输入有效的数字。")
解释:
- 类似标记完成,先显示任务列表。
- 使用
pop方法删除指定索引的任务。 - 显示被删除的任务描述以确认。
10. 主函数
创建一个主函数来协调所有操作。
def main():
"""主函数,程序入口"""
tasks = load_tasks() # 启动时加载任务
while True:
choice = show_menu()
if choice == "1":
add_task(tasks)
elif choice == "2":
view_tasks(tasks)
elif choice == "3":
mark_task_completed(tasks)
elif choice == "4":
delete_task(tasks)
elif choice == "5":
save_tasks(tasks) # 退出前保存
print("再见!")
break
else:
print("无效选项,请重新输入。")
解释:
while True循环保持程序运行,直到用户选择退出。- 根据用户选择调用相应函数。
- 退出时保存任务到文件。
11. 运行程序
在文件末尾添加以下代码,使脚本可直接运行:
if __name__ == "__main__":
main()
解释:
if __name__ == "__main__"确保只有当直接运行脚本时才执行main(),便于模块化。
第四步:测试和运行
保存main.py文件,在终端中导航到项目文件夹,运行:
python main.py
程序将显示菜单。尝试以下操作:
- 选择“1”添加任务,例如“学习Python”。
- 选择“2”查看任务,应显示“✗ 学习Python”。
- 选择“3”标记任务完成,输入编号1,然后查看任务,应显示“✓ 学习Python”。
- 选择“4”删除任务,输入编号1,任务被删除。
- 选择“5”退出,程序会保存任务到
tasks.json文件。
下次运行程序时,任务将自动加载。你可以打开tasks.json查看内容,它应该类似:
[
{
"description": "学习Python",
"completed": true
}
]
第五步:扩展和改进
一旦你掌握了基础,可以尝试以下扩展:
- 添加截止日期:在任务字典中添加
due_date字段,并修改相关函数。 - 分类任务:使用多个列表或字典按类别组织任务。
- 图形界面:使用Tkinter库创建GUI版本。
- Web版本:使用Flask或Django构建Web应用。
例如,添加截止日期的简单扩展:
# 在add_task函数中修改
description = input("请输入任务描述: ").strip()
due_date = input("请输入截止日期 (YYYY-MM-DD,可选): ").strip()
task = {"description": description, "completed": False}
if due_date:
task["due_date"] = due_date
tasks.append(task)
结论
通过这个项目,你不仅创建了一个实用的待办事项管理器,还学习了编程的基本概念。编程的关键在于实践和迭代——从简单开始,逐步添加功能。记住,每个专家都曾是初学者。保持好奇心,继续探索更多有趣的编程案例,你的第一个小程序项目只是开始!
如果你遇到问题,可以查阅Python官方文档或在线社区。祝你编程愉快!
