📌 Introduction
La programmation en Python est idéale pour développer des applications pratiques comme un gestionnaire de tâches. Cet article vous guidera dans la création d’un programme simple mais puissant qui permet d’ajouter, afficher, supprimer et enregistrer des tâches en utilisant un fichier JSON.
📌 Ce que vous allez apprendre :
✅ Manipuler les listes et dictionnaires
✅ Lire et écrire des fichiers JSON
✅ Utiliser des fonctions pour structurer un programme
✅ Créer une interface en ligne de commande interactive
📌 Installation de Python : Téléchargez-le depuis python.org.
📌 Créer un fichier Python :
touch gestionnaire_taches.py
Nous allons stocker les tâches dans un fichier JSON, sous forme de liste de dictionnaires.
Exemple de fichier taches.json
:
[
{"tache": "Acheter du lait", "statut": "En cours"},
{"tache": "Envoyer l'email de confirmation", "statut": "Terminée"}
]
Créons un programme modulaire pour gérer les tâches.
import json
FICHIER_TACHES = "taches.json"
def charger_taches():
"""Charge les tâches depuis un fichier JSON."""
try:
with open(FICHIER_TACHES, "r") as fichier:
return json.load(fichier)
except FileNotFoundError:
return []
def sauvegarder_taches(taches):
"""Sauvegarde les tâches dans un fichier JSON."""
with open(FICHIER_TACHES, "w") as fichier:
json.dump(taches, fichier, indent=4)
✔ charger_taches()
: Lit le fichier JSON et retourne une liste de tâches.
✔ sauvegarder_taches()
: Écrit les tâches dans le fichier JSON.
def ajouter_tache(taches):
"""Ajoute une nouvelle tâche à la liste."""
tache = input("Entrez la nouvelle tâche : ")
taches.append({"tache": tache, "statut": "En cours"})
print("✅ Tâche ajoutée avec succès !")
✔ Demande une entrée utilisateur et ajoute la tâche à la liste.
def afficher_taches(taches):
"""Affiche toutes les tâches."""
if not taches:
print("📌 Aucune tâche enregistrée.")
else:
print("\n📋 Liste des tâches :")
for i, tache in enumerate(taches, 1):
print(f"{i}. {tache['tache']} - {tache['statut']}")
✔ Parcourt et affiche chaque tâche avec son statut.
def modifier_statut_tache(taches):
"""Permet de changer le statut d'une tâche."""
afficher_taches(taches)
try:
index = int(input("Entrez le numéro de la tâche à modifier : ")) - 1
if 0 <= index < len(taches):
nouveau_statut = input("Nouveau statut (En cours / Terminée) : ")
taches[index]["statut"] = nouveau_statut
print("🔄 Statut mis à jour !")
else:
print("❌ Numéro invalide.")
except ValueError:
print("⚠️ Veuillez entrer un nombre valide.")
✔ Permet de modifier le statut d’une tâche en fonction de son numéro.
def supprimer_tache(taches):
"""Supprime une tâche de la liste."""
afficher_taches(taches)
try:
index = int(input("Entrez le numéro de la tâche à supprimer : ")) - 1
if 0 <= index < len(taches):
del taches[index]
print("🗑️ Tâche supprimée avec succès !")
else:
print("❌ Numéro invalide.")
except ValueError:
print("⚠️ Veuillez entrer un nombre valide.")
✔ Supprime une tâche de la liste.
Nous allons regrouper ces fonctions dans une interface interactive.
def gestionnaire_taches():
"""Interface utilisateur pour la gestion des tâches."""
taches = charger_taches()
while True:
print("\n🔹 Menu :")
print("1️⃣ Ajouter une tâche")
print("2️⃣ Afficher les tâches")
print("3️⃣ Modifier le statut d'une tâche")
print("4️⃣ Supprimer une tâche")
print("5️⃣ Sauvegarder et quitter")
choix = input("👉 Choisissez une option : ")
if choix == "1":
ajouter_tache(taches)
elif choix == "2":
afficher_taches(taches)
elif choix == "3":
modifier_statut_tache(taches)
elif choix == "4":
supprimer_tache(taches)
elif choix == "5":
sauvegarder_taches(taches)
print("💾 Tâches sauvegardées. 👋 Au revoir !")
break
else:
print("⚠️ Option invalide, essayez encore.")
# Lancer le programme
gestionnaire_taches()
✅ Lire et écrire dans un fichier JSON
✅ Manipuler des listes et dictionnaires en Python
✅ Créer une interface interactive avec des choix utilisateur
✅ Structurer un programme avec des fonctions réutilisables
🔹 Ajouter une date d’échéance aux tâches.
🔹 Utiliser une interface graphique avec Tkinter ou PyQt.
🔹 Ajouter une option de recherche de tâches.
🔹 Envoyer des rappels par e-mail avec smtplib
.
Avec ce projet, vous avez mis en pratique les bases essentielles de Python, tout en créant une application utile et modulaire. Enrichissez ce gestionnaire avec de nouvelles fonctionnalités pour monter en compétences en programmation Python.
Créer un gestionnaire de tâches en Python permettant :
✅ D’ajouter, afficher, modifier et supprimer des tâches
✅ De sauvegarder les tâches dans un fichier JSON
✅ De créer une interface en ligne de commande interactive
📍 Vérifier l’installation de Python
python --version
touch gestionnaire_taches.py
📍 Fichier taches.json
(Format de stockage)
[
{"tache": "Acheter du lait", "statut": "En cours"},
{"tache": "Réviser Python", "statut": "Terminée"}
]
import json
FICHIER_TACHES = "taches.json"
def charger_taches():
"""Charge les tâches depuis un fichier JSON."""
try:
with open(FICHIER_TACHES, "r") as fichier:
return json.load(fichier)
except FileNotFoundError:
return []
def sauvegarder_taches(taches):
"""Sauvegarde les tâches dans un fichier JSON."""
with open(FICHIER_TACHES, "w") as fichier:
json.dump(taches, fichier, indent=4)
def ajouter_tache(taches):
"""Ajoute une nouvelle tâche."""
tache = input("Entrez la nouvelle tâche : ")
taches.append({"tache": tache, "statut": "En cours"})
print("✅ Tâche ajoutée !")
def afficher_taches(taches):
"""Affiche toutes les tâches."""
if not taches:
print("📌 Aucune tâche.")
else:
print("\n📋 Liste des tâches :")
for i, tache in enumerate(taches, 1):
print(f"{i}. {tache['tache']} - {tache['statut']}")
def modifier_statut_tache(taches):
"""Modifie le statut d'une tâche."""
afficher_taches(taches)
try:
index = int(input("Numéro de la tâche à modifier : ")) - 1
if 0 <= index < len(taches):
nouveau_statut = input("Nouveau statut (En cours / Terminée) : ")
taches[index]["statut"] = nouveau_statut
print("🔄 Statut mis à jour !")
else:
print("❌ Numéro invalide.")
except ValueError:
print("⚠️ Entrez un nombre valide.")
def supprimer_tache(taches):
"""Supprime une tâche."""
afficher_taches(taches)
try:
index = int(input("Numéro de la tâche à supprimer : ")) - 1
if 0 <= index < len(taches):
del taches[index]
print("🗑️ Tâche supprimée !")
else:
print("❌ Numéro invalide.")
except ValueError:
print("⚠️ Entrez un nombre valide.")
def gestionnaire_taches():
"""Interface du gestionnaire de tâches."""
taches = charger_taches()
while True:
print("\n🔹 Menu :")
print("1️⃣ Ajouter une tâche")
print("2️⃣ Afficher les tâches")
print("3️⃣ Modifier une tâche")
print("4️⃣ Supprimer une tâche")
print("5️⃣ Sauvegarder et quitter")
choix = input("👉 Choisissez une option : ")
if choix == "1":
ajouter_tache(taches)
elif choix == "2":
afficher_taches(taches)
elif choix == "3":
modifier_statut_tache(taches)
elif choix == "4":
supprimer_tache(taches)
elif choix == "5":
sauvegarder_taches(taches)
print("💾 Tâches sauvegardées. 👋 Au revoir !")
break
else:
print("⚠️ Option invalide.")
# Lancer le programme
gestionnaire_taches()
✅ Manipuler les fichiers JSON en lecture/écriture
✅ Créer une interface interactive avec des choix utilisateur
✅ Structurer un programme avec des fonctions
Lors de la programmation d’un gestionnaire de tâches en Python avec stockage JSON, certains bugs peuvent apparaître. Voici une liste des bugs possibles, leur cause, et la solution appropriée.
Lorsque le fichier taches.json
n’existe pas, une erreur FileNotFoundError peut survenir.
FileNotFoundError: [Errno 2] No such file or directory: 'taches.json'
✔ Vérifier si le fichier existe avant d’essayer de le lire.
✔ Si le fichier n’existe pas, créer une liste vide au lieu de lever une erreur.
Correction dans charger_taches()
:
def charger_taches():
"""Charge les tâches depuis un fichier JSON."""
try:
with open("taches.json", "r") as fichier:
return json.load(fichier)
except FileNotFoundError:
return [] # Retourne une liste vide si le fichier n'existe pas
Si le fichier JSON contient une erreur de syntaxe (modification manuelle ou corruption), Python lève une JSONDecodeError.
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
✔ Ajouter une gestion d’erreur pour éviter le plantage si le fichier est corrompu.
✔ Si le JSON est invalide, réinitialiser le fichier.
Correction :
def charger_taches():
"""Charge les tâches et gère les erreurs JSON."""
try:
with open("taches.json", "r") as fichier:
return json.load(fichier)
except (FileNotFoundError, json.decoder.JSONDecodeError):
return [] # Retourne une liste vide si erreur
Si l’utilisateur entre un numéro invalide (hors de la liste) pour modifier ou supprimer une tâche, une erreur se produit :
IndexError: list index out of range
✔ Vérifier si l’index entré est bien compris dans la liste.
✔ Si l’utilisateur saisit un index invalide, afficher un message d’erreur.
Correction dans supprimer_tache()
et modifier_statut_tache()
:
def supprimer_tache(taches):
"""Supprime une tâche de la liste en vérifiant l'entrée utilisateur."""
afficher_taches(taches)
try:
index = int(input("Entrez le numéro de la tâche à supprimer : ")) - 1
if 0 <= index < len(taches):
del taches[index]
print("🗑️ Tâche supprimée avec succès !")
else:
print("❌ Numéro invalide.")
except ValueError:
print("⚠️ Veuillez entrer un nombre valide.")
Si le programme se ferme brusquement, les tâches ajoutées ne sont pas enregistrées dans le fichier JSON.
✔ Ajouter une option de sauvegarde automatique après chaque modification.
✔ Sauvegarder les tâches après ajout, modification ou suppression.
Correction :
def ajouter_tache(taches):
"""Ajoute une tâche et sauvegarde immédiatement."""
tache = input("Entrez la nouvelle tâche : ")
taches.append({"tache": tache, "statut": "En cours"})
sauvegarder_taches(taches) # Sauvegarde automatique
print("✅ Tâche ajoutée et sauvegardée !")
Si l’utilisateur entre un texte au lieu d’un nombre pour choisir une option du menu, Python affiche :
ValueError: invalid literal for int() with base 10
✔ Vérifier si l’entrée est un nombre avant de continuer.
✔ Utiliser try-except
pour éviter l’erreur.
Correction dans gestionnaire_taches()
:
def gestionnaire_taches():
"""Interface interactive robuste avec gestion des erreurs."""
taches = charger_taches()
while True:
print("\n🔹 Menu :")
print("1️⃣ Ajouter une tâche")
print("2️⃣ Afficher les tâches")
print("3️⃣ Modifier une tâche")
print("4️⃣ Supprimer une tâche")
print("5️⃣ Sauvegarder et quitter")
choix = input("👉 Choisissez une option : ")
if choix == "1":
ajouter_tache(taches)
elif choix == "2":
afficher_taches(taches)
elif choix == "3":
modifier_statut_tache(taches)
elif choix == "4":
supprimer_tache(taches)
elif choix == "5":
sauvegarder_taches(taches)
print("💾 Tâches sauvegardées. 👋 Au revoir !")
break
else:
print("⚠️ Option invalide, veuillez entrer un chiffre entre 1 et 5.")
Si deux programmes Python (ou un script + un éditeur) accèdent simultanément au fichier taches.json
, une corruption peut survenir.
✔ Utiliser un verrouillage de fichier (with open(...) as f:
) pour empêcher plusieurs écritures simultanées.
Correction :
import threading
lock = threading.Lock()
def sauvegarder_taches(taches):
"""Empêche la corruption du fichier en utilisant un verrou."""
with lock:
with open("taches.json", "w") as fichier:
json.dump(taches, fichier, indent=4)
🛠️ Bug | 🔍 Problème | ✅ Solution |
---|---|---|
Fichier JSON Introuvable | FileNotFoundError | Retourner une liste vide si le fichier n’existe pas |
Format JSON Corrompu | JSONDecodeError | Gérer l’erreur et réinitialiser les tâches |
Numéro de tâche invalide | IndexError | Vérifier si l’index est dans la liste |
Fermeture sans sauvegarde | Perte de données | Sauvegarde automatique après chaque modification |
Erreur de saisie utilisateur | ValueError | Vérifier si l’entrée est un nombre valide |
Concurrence d’accès au fichier | Corruption du fichier JSON | Utiliser un verrou (threading.Lock() ) |
Télécharger un canevas Word Présentation d’Entreprise ⬇︎ 1. Définition : Qu’est-ce qu’une Présentation d’Entreprise ?…
Le dossier professionnel est un document essentiel pour structurer et valoriser un parcours professionnel. Il…
Une présentation de dossier est un document structuré qui permet d’exposer de manière claire et…
Maîtriser la Syntaxe en Français La syntaxe est l'un des piliers fondamentaux de la langue…
Dans le marché compétitif d'aujourd'hui, une proposition de valeur pertinente est primordiale pour distinguer une…
Lors de l’élaboration ou de la révision d’un texte législatif, réglementaire ou statutaire, les propositions…
This website uses cookies.