编程世界充满了无限可能,而从零开始打造一个属于自己的小程序项目,是开启这段旅程最有趣的方式之一。本文将带你一步步完成一个简单但功能完整的“个人待办事项管理器”小程序项目。这个项目不仅实用,还能让你掌握编程的核心概念,如变量、函数、条件判断、循环和数据存储等。我们将使用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或甚至记事本)来编写代码。

第二步:设计程序结构

一个简单的待办事项管理器应该包含以下功能:

  1. 显示菜单:让用户选择操作(添加任务、查看任务、标记完成、删除任务、退出)。
  2. 添加任务:输入任务描述并保存。
  3. 查看任务:列出所有任务,包括完成状态。
  4. 标记完成:将任务标记为已完成。
  5. 删除任务:移除指定任务。
  6. 数据持久化:将任务保存到文件中,以便下次启动时加载。

我们将使用一个列表来存储任务,每个任务是一个字典,包含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. 选择“1”添加任务,例如“学习Python”。
  2. 选择“2”查看任务,应显示“✗ 学习Python”。
  3. 选择“3”标记任务完成,输入编号1,然后查看任务,应显示“✓ 学习Python”。
  4. 选择“4”删除任务,输入编号1,任务被删除。
  5. 选择“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官方文档或在线社区。祝你编程愉快!