Programador Leigo
Projetos 8 min leitura 16 MAR 2026

Como criar uma lista de tarefas em Python

Construa um gerenciador de tarefas no terminal com opções de adicionar, listar, concluir e salvar em arquivo.


O que vamos construir?

Um gerenciador de tarefas (to-do list) que roda no terminal. O usuário pode adicionar tarefas, marcar como concluídas, remover e ver a lista atualizada. E o melhor: as tarefas ficam salvas em um arquivo, então não se perdem quando o programa fecha.

Este é o projeto final da trilha e combina tudo que você aprendeu: listas, dicionários, funções, loops, condicionais e manipulação de arquivos.

Estrutura das tarefas

Cada tarefa é um dicionário com o texto e o status:

tarefa = {"texto": "Estudar Python", "feita": False}

Todas as tarefas ficam em uma lista:

tarefas = [
    {"texto": "Estudar Python", "feita": False},
    {"texto": "Fazer exercicios", "feita": True},
]

Exibindo as tarefas

Vamos mostrar a lista com numeração e um indicador visual de status:

def listar_tarefas(tarefas):
    if not tarefas:
        print("\nNenhuma tarefa cadastrada.")
        return

    print("\n--- SUAS TAREFAS ---")
    for i, t in enumerate(tarefas, 1):
        status = "[x]" if t["feita"] else "[ ]"
        print(f"  {i}. {status} {t['texto']}")
    print()

    total = len(tarefas)
    feitas = len([t for t in tarefas if t["feita"]])
    print(f"  {feitas}/{total} concluidas")

A saída fica assim:

--- SUAS TAREFAS ---
  1. [x] Estudar Python
  2. [ ] Fazer exercicios
  3. [ ] Ler documentacao

  1/3 concluidas

Adicionando tarefas

def adicionar_tarefa(tarefas):
    texto = input("Nova tarefa: ").strip()
    if not texto:
        print("Tarefa nao pode ser vazia.")
        return
    tarefas.append({"texto": texto, "feita": False})
    print(f"Tarefa adicionada: {texto}")

O .strip() remove espaços extras no início e fim do texto.

Marcando como concluída

O usuário digita o número da tarefa para marcar ou desmarcar:

def concluir_tarefa(tarefas):
    listar_tarefas(tarefas)
    if not tarefas:
        return

    try:
        num = int(input("Numero da tarefa: "))
        if 1 <= num <= len(tarefas):
            tarefa = tarefas[num - 1]
            tarefa["feita"] = not tarefa["feita"]
            estado = "concluida" if tarefa["feita"] else "reaberta"
            print(f"Tarefa {estado}: {tarefa['texto']}")
        else:
            print("Numero invalido.")
    except ValueError:
        print("Digite um numero.")

O not tarefa["feita"] inverte o estado: se estava concluída, reabre; se estava aberta, conclui.

Removendo tarefas

def remover_tarefa(tarefas):
    listar_tarefas(tarefas)
    if not tarefas:
        return

    try:
        num = int(input("Numero da tarefa para remover: "))
        if 1 <= num <= len(tarefas):
            removida = tarefas.pop(num - 1)
            print(f"Removida: {removida['texto']}")
        else:
            print("Numero invalido.")
    except ValueError:
        print("Digite um numero.")

O método .pop(indice) remove o item da lista e retorna o valor removido.

Salvando e carregando do arquivo

Para que as tarefas persistam entre execuções, salvamos em um arquivo JSON:

import json

ARQUIVO = "tarefas.json"


def salvar_tarefas(tarefas):
    with open(ARQUIVO, "w", encoding="utf-8") as f:
        json.dump(tarefas, f, ensure_ascii=False, indent=2)


def carregar_tarefas():
    try:
        with open(ARQUIVO, "r", encoding="utf-8") as f:
            return json.load(f)
    except FileNotFoundError:
        return []
  • json.dump() converte a lista de dicionários para JSON e salva no arquivo
  • json.load() lê o arquivo e converte de volta para Python
  • Se o arquivo não existir, retorna uma lista vazia

O menu e o loop principal

def mostrar_menu():
    print()
    print("=== LISTA DE TAREFAS ===")
    print("1. Ver tarefas")
    print("2. Adicionar tarefa")
    print("3. Concluir/Reabrir tarefa")
    print("4. Remover tarefa")
    print("5. Sair")
    print()

Código completo

import json

ARQUIVO = "tarefas.json"


def carregar_tarefas():
    try:
        with open(ARQUIVO, "r", encoding="utf-8") as f:
            return json.load(f)
    except FileNotFoundError:
        return []


def salvar_tarefas(tarefas):
    with open(ARQUIVO, "w", encoding="utf-8") as f:
        json.dump(tarefas, f, ensure_ascii=False, indent=2)


def listar_tarefas(tarefas):
    if not tarefas:
        print("\nNenhuma tarefa cadastrada.")
        return

    print("\n--- SUAS TAREFAS ---")
    for i, t in enumerate(tarefas, 1):
        status = "[x]" if t["feita"] else "[ ]"
        print(f"  {i}. {status} {t['texto']}")

    total = len(tarefas)
    feitas = len([t for t in tarefas if t["feita"]])
    print(f"\n  {feitas}/{total} concluidas")


def adicionar_tarefa(tarefas):
    texto = input("Nova tarefa: ").strip()
    if not texto:
        print("Tarefa nao pode ser vazia.")
        return
    tarefas.append({"texto": texto, "feita": False})
    print(f"Tarefa adicionada: {texto}")


def concluir_tarefa(tarefas):
    listar_tarefas(tarefas)
    if not tarefas:
        return
    try:
        num = int(input("Numero da tarefa: "))
        if 1 <= num <= len(tarefas):
            tarefa = tarefas[num - 1]
            tarefa["feita"] = not tarefa["feita"]
            estado = "concluida" if tarefa["feita"] else "reaberta"
            print(f"Tarefa {estado}: {tarefa['texto']}")
        else:
            print("Numero invalido.")
    except ValueError:
        print("Digite um numero.")


def remover_tarefa(tarefas):
    listar_tarefas(tarefas)
    if not tarefas:
        return
    try:
        num = int(input("Numero da tarefa para remover: "))
        if 1 <= num <= len(tarefas):
            removida = tarefas.pop(num - 1)
            print(f"Removida: {removida['texto']}")
        else:
            print("Numero invalido.")
    except ValueError:
        print("Digite um numero.")


def main():
    tarefas = carregar_tarefas()
    print("=== LISTA DE TAREFAS ===")

    while True:
        print()
        print("1. Ver tarefas")
        print("2. Adicionar tarefa")
        print("3. Concluir/Reabrir tarefa")
        print("4. Remover tarefa")
        print("5. Sair")

        escolha = input("\nEscolha: ").strip()

        if escolha == "1":
            listar_tarefas(tarefas)
        elif escolha == "2":
            adicionar_tarefa(tarefas)
            salvar_tarefas(tarefas)
        elif escolha == "3":
            concluir_tarefa(tarefas)
            salvar_tarefas(tarefas)
        elif escolha == "4":
            remover_tarefa(tarefas)
            salvar_tarefas(tarefas)
        elif escolha == "5":
            salvar_tarefas(tarefas)
            print("Ate mais!")
            break
        else:
            print("Opcao invalida.")


main()

O que você aprendeu

  • Manipulação de arquivos com open(), json.dump() e json.load()
  • Persistência de dados entre execuções
  • CRUD completo (criar, ler, atualizar, deletar)
  • Programa com múltiplas funções trabalhando juntas

Dicas para ir além

  • Prioridades: adicionar um campo "prioridade" (alta, média, baixa)
  • Data limite: registrar quando a tarefa deve ser feita
  • Filtros: mostrar apenas tarefas pendentes ou apenas concluídas
  • Interface gráfica: usar tkinter para criar uma versão com janela

Conclusão

Parabéns por completar a trilha Projetos Python para Iniciantes! Você construiu 7 projetos do zero: jogo de adivinhação, quiz, calculadora, gerador de senhas, jogo da velha, desenhos com Turtle e uma lista de tarefas com persistência em arquivo. Cada projeto reforçou conceitos fundamentais de Python de forma prática e divertida.

O próximo passo é escolher outra trilha que te interesse: automação, criação de sites, banco de dados ou data science. A base você já tem.

Continue lendo

Compartilhar