09. Проект: система задач

Проект: система задач

Описание: В этом уроке вы создадите собственное приложение для управления задачами (TODO-систему) в консоли. Оно позволит добавлять, удалять, отмечать и сохранять задачи. Мы применим ООП, работу с файлами и обработку пользовательского ввода.

1. Цель проекта

Наша цель — написать консольное приложение, которое:
  • Добавляет задачи с приоритетом и описанием.
  • Отображает список задач с их статусами.
  • Позволяет отмечать задачи как выполненные.
  • Сохраняет все данные в JSON-файле.

2. Основные технологии

Мы будем использовать:
  • json — для хранения данных между запусками.
  • os — для работы с файловой системой.
  • ООП — для структурирования кода.

3. Подготовка проекта

Создайте файл todo.py.

import json, os

class Task: def __init__(self, title, description='', priority='normal', done=False): self.title = title self.description = description self.priority = priority self.done = done

def to_dict(self): return { 'title': self.title, 'description': self.description, 'priority': self.priority, 'done': self.done }

class TaskManager: def __init__(self, filename='tasks.json'): self.filename = filename self.tasks = self.load_tasks()

def load_tasks(self): if os.path.exists(self.filename): with open(self.filename, 'r', encoding='utf-8') as f: return json.load(f) return []

def save_tasks(self): with open(self.filename, 'w', encoding='utf-8') as f: json.dump(self.tasks, f, indent=2, ensure_ascii=False)

def add_task(self, task): self.tasks.append(task.to_dict()) self.save_tasks() print(f' Задача «{task.title}» добавлена.')

def list_tasks(self): if not self.tasks: print('Список задач пуст.') return print('\n Текущие задачи:') for i, t in enumerate(self.tasks, start=1): status = '' if t['done'] else '' print(f'{i}. {t["title"]} [{t["priority"]}] {status}')

def mark_done(self, index): try: self.tasks[index]['done'] = True self.save_tasks() print(f'Задача «{self.tasks[index]["title"]}» отмечена как выполненная!') except IndexError: print(' Неверный номер задачи.')

def delete_task(self, index): try: removed = self.tasks.pop(index) self.save_tasks() print(f'Удалена задача: {removed["title"]}') except IndexError: print(' Неверный номер задачи.')

4. Реализация интерфейса CLI

Теперь добавим меню для управления задачами:

def main():
    manager = TaskManager()

while True: print('\n=== СИСТЕМА ЗАДАЧ ===') print('[1] Показать все задачи') print('[2] Добавить задачу') print('[3] Отметить задачу выполненной') print('[4] Удалить задачу') print('[0] Выход') choice = input('Выберите действие: ')

if choice == '1': manager.list_tasks() elif choice == '2': title = input('Название задачи: ') desc = input('Описание: ') pr = input('Приоритет (low / normal / high): ') or 'normal' manager.add_task(Task(title, desc, pr)) elif choice == '3': manager.list_tasks() idx = int(input('Введите номер задачи: ')) - 1 manager.mark_done(idx) elif choice == '4': manager.list_tasks() idx = int(input('Введите номер задачи: ')) - 1 manager.delete_task(idx) elif choice == '0': print(' До встречи!') break else: print('Неверный выбор. Попробуйте снова.')

if __name__ == '__main__': main()

5. Пример использования

Пример работы программы в консоли:

=== СИСТЕМА ЗАДАЧ ===
[1] Показать все задачи
[2] Добавить задачу
[3] Отметить задачу выполненной
[4] Удалить задачу
[0] Выход
Выберите действие: 2
Название задачи: Написать отчёт
Описание: Для начальника отдела
Приоритет (low / normal / high): high
Задача «Написать отчёт» добавлена.

После перезапуска все задачи сохраняются в tasks.json:


[
  {
    "title": "Написать отчёт",
    "description": "Для начальника отдела",
    "priority": "high",
    "done": false
  }
]

6. Расширение функционала

Чтобы сделать приложение мощнее, можно добавить:
  • Фильтрацию задач по приоритету.
  • Отдельную команду для показа только завершённых задач.
  • Цветной вывод через модуль colorama.
  • Логирование действий (logging).

7. Установка и запуск

Убедитесь, что Python установлен. При необходимости обновите pip:

python -m ensurepip --upgrade

Запуск:


python todo.py

Итоги урока

Теперь вы умеете:
  • Создавать консольное приложение с интерактивным меню.
  • Использовать классы и JSON для хранения данных.
  • Реализовывать CRUD-операции (Create, Read, Update, Delete).
  • Работать с файлами и пользовательским вводом.