Aller au contenu principal

API avec Tkinter

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

astuce

Si vous n'avez jamais utilisé Tkinter, consultez d'abord le tuto :

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 requests si 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
  • tkinter est la bibliothèque standard de Python pour créer des interfaces graphiques.
  • ttk permet d’avoir des widgets plus modernes (menus déroulants, boutons...).
  • scrolledtext est 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 /AvailableCountries renvoie 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.

attention

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_var est créée dans le même bloc de code que la fonction charger_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/FR
  • https://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

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