version = "1.2" # создаем переменную с версией программы
tasks = {} # делаем пустой словарик для задач чтобы программа не ругалась если файл пустой
try: # пишем проверку если вдруг файла еще нет на компе
with open("test.txt", "r", encoding="utf-8") as f: # открываем наш файл с текстом для чтения
txt = f.read() # считываем весь текст из файла в одну большую строчку
if txt.strip():
exec(txt, globals()) # если в файле есть текст то превращаем его в код питона
except FileNotFoundError:
pass # если файла вообще не было то просто идем дальше
task_list = list(tasks.keys()) # вытаскиваем все имена задач в отдельный список для нумерации
print(f"TASK-менеджер v{version}. Команды: СТОП, СПИСОК, ДОБАВИТЬ, СТАТУС, УДАЛИТЬ") # выводим приветствие
while True: # запускаем бесконечный цикл чтобы программа не закрывалась сама
cmd = input("\nКоманда: ").strip().upper() # просим команду у пользователя и делаем буквы большими
if cmd == "СТОП": # если ввели СТОП то надо сохраниться и выйти
with open("test.txt", "w", encoding="utf-8") as f:
f.write(f"tasks={tasks}") # записываем наш словарь прямо текстом в файл
print("Сохранено в txt. Выход...")
break # пишем что все ок и ломаем цикл командой break
elif cmd == "СПИСОК": # если просят показать список задач
task_list = list(tasks.keys()) # обновляем список имен чтобы номера не перепутались
if not task_list:
print("Список пуст!") # если задач нет то так и пишем
else: # а если задачи есть то выводим их
for i, name in enumerate(task_list, 1):
print(f"{i}. [{'✓' if tasks[name] else ' '}] {name}") # циклом выводим номер галочку если тру и имя
elif cmd == "ДОБАВИТЬ": # если хотят добавить новую задачу
name = input("Название задачи: ").strip() # просим ввести имя задачи
if name and name not in tasks:
tasks[name] = False # добавляем в словарь со статусом фолс (не выполнено)
task_list.append(name)
print("Добавлено!")
elif cmd == "СТАТУС": # если надо поменять статус у задачи
num = input("Номер задачи для переключения: ").strip() # просим номер задачи на экране
if num.isdigit() and 0 < int(num) <= len(task_list): # проверяем что это точно число и оно есть в списке
name = task_list[int(num) - 1] # отнимаем 1 так как в питоне списки с нуля
tasks[name] = not tasks[name] # меняем тру на фолс или наоборот
print(f"Статус '{name}' изменен!")
else:
print("Неверный номер!") # если ввели фигню то пишем ошибку
elif cmd == "УДАЛИТЬ": # если хотят удалить задачу
num = input("Номер задачи для удаления: ").strip() # просим номер задачи которую надо стереть
if num.isdigit() and 0 < int(num) <= len(task_list): # проверяем число это или нет и подходит ли по размеру
name = task_list.pop(int(num) - 1) # вырезаем из списка номеров
del tasks[name] # полностью удаляем из основного словаря
print(f"Задача '{name}' удалена!")
else:
print("Неверный номер!") # если номер не подошел выводим это на экран