09. Проект: система задач
Проект: система задач
Описание: В этом уроке вы создадите собственное приложение для управления задачами (TODO-систему) в консоли. Оно позволит добавлять, удалять, отмечать и сохранять задачи. Мы применим ООП, работу с файлами и обработку пользовательского ввода.1. Цель проекта
Наша цель — написать консольное приложение, которое:- Добавляет задачи с приоритетом и описанием.
- Отображает список задач с их статусами.
- Позволяет отмечать задачи как выполненные.
- Сохраняет все данные в JSON-файле.
2. Основные технологии
Мы будем использовать:- json — для хранения данных между запусками.
- os — для работы с файловой системой.
- ООП — для структурирования кода.
3. Подготовка проекта
Создайте файл todo.py.
import json, osclass 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).
- Работать с файлами и пользовательским вводом.