API avec Tkinter
Créer une interface graphique simple avec Tkinter pour consommer une API REST.

Si vous n'avez jamais utilisé Tkinter, consultez d'abord le tuto :
- Découvrir Tkinter pour apprendre les bases.
Mission :
Créer un programme Python avec une interface graphique simple (utilisant Tkinter)
qui permet à l'utilisateur de choisir un pays et une année,
puis affiche les jours fériés correspondants en France ou dans le pays sélectionné.
L'interface va inclure des menus déroulants pour le choix interactif, et un bouton pour charger les données depuis l'API.
Nous utilisons toujours l'API publique : https://date.nager.at/Api/
Endpoints utilisés :
- Liste des pays disponibles :
https://date.nager.at/api/v3/AvailableCountries - Jours fériés pour un pays/année :
https://date.nager.at/api/v3/publicholidays/{année}/{code-pays}
Prérequis :
- Python installé (version 3.6+).
- Tkinter est inclus par défaut dans Python (pas d'installation supplémentaire).
- Installez la bibliothèque
requestssi ce n’est pas déjà fait :pip install requests
Étapes
1. Créer un dossier tp-api-rest-python-gui dans le dossier de vos Documents.
2. Ouvrir un Terminal et se placer dans ce dossier.
3. Crée un fichier nommé jours_feries_gui.py.
4. Ouvrir jours_feries_gui.py avec Visual Studio Code et écrire le code suivant pour importer les modules nécessaires
import requests
import tkinter as tk
from tkinter import ttk, scrolledtext
from datetime import datetime
tkinterest la bibliothèque standard de Python pour créer des interfaces graphiques.ttkpermet d’avoir des widgets plus modernes (menus déroulants, boutons...).scrolledtextest une zone de texte avec une barre de défilement.
5. Récupérer la liste des pays disponibles avec une fonction charger_pays()
def charger_pays():
url = "https://date.nager.at/api/v3/AvailableCountries"
try:
reponse = requests.get(url)
reponse.raise_for_status()
return reponse.json()
except Exception as e:
print(f"Erreur lors du chargement des pays : {e}")
return []
Rôle : Récupère la liste des pays pour lesquels l’API dispose de données de jours fériés.
- L’endpoint
/AvailableCountriesrenvoie une liste de dictionnaires du style :[
{"countryCode": "FR", "name": "France"},
{"countryCode": "DE", "name": "Germany"},
...
] raise_for_status()→ déclenche une exception si le code HTTP n’est pas 2xx (ex: 404, 500)try/except→ permet de gérer proprement les erreurs (site inaccessible, mauvaise année, etc.)C’est l’équivalent en PHP de
try {}/catch {}et en JavaScript de.catch().
6. Récupérer la liste des jours fériés avec une fonction charger_jours_feries()
def charger_jours_feries():
annee = annee_var.get()
pays = pays_var.get()
if not annee or not pays:
zone_texte.delete(1.0, tk.END)
zone_texte.insert(tk.END, "Veuillez sélectionner une année et un pays.")
return
On récupère les valeurs choisies dans les menus déroulants (via les StringVar).
Si l’utilisateur n’a rien sélectionné → message d’avertissement et on arrête la fonction.
En Python, la fonction charger_jours_feries()
peut accéder directement à la variable annee_var et pays_var
sans qu’il soit nécessaire de la lui passer en paramètre,
car annee_var et pays_var sont définies dans la même portée globale que la fonction :
- La variable
annee_varest créée dans le même bloc de code que la fonctioncharger_jours_feries(), donc elle est visible et accessible à l’intérieur de cette fonction. - En Python, les fonctions peuvent accéder aux variables définies dans leur environnement extérieur (portée englobante), ce qui évite de devoir passer explicitement ces variables en argument.
- Cela simplifie le code et évite de devoir modifier la signature de la fonction pour transmettre des widgets ou autres objets déjà accessibles.
Ainsi, dans ce cas, charger_jours_feries() utilise directement annee_var.get() et pays_var.get() pour récupérer les valeurs sélectionnées, sans que ces variables aient besoin d’être des paramètres de la fonction.
C’est une pratique courante en programmation Python avec des interfaces graphiques,
où les widgets sont souvent créés dans un même scope et utilisés dans des fonctions de rappel (callbacks) sans passage explicite d’arguments.
url = f"https://date.nager.at/api/v3/publicholidays/{annee}/{pays}"
Construit l’URL de l’API, par exemple :
https://date.nager.at/api/v3/publicholidays/2026/FRhttps://date.nager.at/api/v3/publicholidays/2025/CH
try:
reponse = requests.get(url)
reponse.raise_for_status()
jours = reponse.json()
On fait la requête et on transforme la réponse JSON en liste Python.
Exemple de structure d’un élément renvoyé par l’API :
{
"date": "2026-01-01",
"localName": "Jour de l'an",
"name": "New Year's Day",
"countryCode": "FR",
"fixed": true,
"global": true,
"counties": null,
"launchYear": null,
"types": ["Public"]
}
7. Créer l’interface utilisateur
fenetre = tk.Tk()
fenetre.title("Jours Fériés - API Explorer")
fenetre.geometry("600x500")
- On initialise une fenêtre avec un titre et une taille.
# Liste des années disponibles
annee_actuelle = datetime.now().year # Récupère l'année actuelle (ex: 2026)
for i in range(0, 6):
# print(annee_actuelle + i) # Pour debug
annees = [str(annee_actuelle + i)] # Génère une liste d'années (2026 à 2031)
# Menus déroulants avec ttk.Combobox
combo_annee = ttk.Combobox(fenetre, textvariable=annee_var, values=annees, state="readonly")
combo_pays = ttk.Combobox(fenetre, textvariable=pays_var, values=sorted(codes_pays), state="readonly")
- L’utilisateur peut choisir l’année et le pays via des menus déroulants.
- Les valeurs sont générées dynamiquement (année actuelle + 5 années suivantes).
8. Afficher les jours fériés dans la zone de texte
def charger_jours_feries():
annee = annee_var.get()
pays = pays_var.get()
url = f"https://date.nager.at/api/v3/publicholidays/{annee}/{pays}"
try:
reponse = requests.get(url)
reponse.raise_for_status()
jours = reponse.json()
zone_texte.delete(1.0, tk.END)
for jour in jours:
zone_texte.insert(tk.END, f"{jour['date']} → {jour['localName']:30} ({jour['name']})\n")
except Exception as e:
zone_texte.delete(1.0, tk.END)
zone_texte.insert(tk.END, f"Erreur : {e}")
- Quand l’utilisateur clique sur le bouton, cette fonction est appelée.
- Elle récupère les jours fériés et les affiche dans une zone de texte avec défilement.
try / except → permet de gérer proprement les erreurs (site inaccessible, mauvaise année, etc.)
C’est l’équivalent en PHP de
try {}/catch {}et en JavaScript de.catch().
9. Ajouter le bouton et la zone de texte
bouton_charger = tk.Button(fenetre, text="Charger les jours fériés", command=charger_jours_feries)
zone_texte = scrolledtext.ScrolledText(fenetre, wrap=tk.WORD, width=70, height=20)
- Le bouton déclenche la récupération des données.
- La zone de texte affiche les résultats avec une barre de défilement.
10. Appeler la méthode mainloop() pour lancer l’application
fenetre.mainloop()
- Cette ligne lance la boucle principale de Tkinter : elle attend les actions de l’utilisateur.
Corrigé
Une solution
Vous devez être connecté pour voir le contenu.
Lancer le programme
Pour exécuter le programme, il suffit de saisir dans le Terminal :
python jours_feries_gui.py
ou
python3 jours_feries_gui.py
ou
py jours_feries_gui.py
Si l'erreur ModuleNotFoundError: No module named 'requests's'affiche
Pour résoudre l'erreur,
il suffit d'installer le module requests dans votre environnement Python,
avec la commande :
pip install requests