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 arquivojson.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()ejson.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
tkinterpara 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.