2023-08-13 14:20 Temps de lecture : 16 min

Comment créer une application de recherche de recettes à l'aide de Python

Naviguer à travers l'océan de recettes en ligne, souvent jonché de publicités intrusives et de liens trompeurs, peut s'avérer une tâche ardue. La conception d'une application de recherche de recettes offre une alternative sur mesure, une expérience utilisateur soignée et un environnement épuré, éliminant les distractions et résultats superflus.

En développant une telle application, vous perfectionnerez vos compétences en matière de requêtes HTTP, de gestion de clés API, de manipulation d'images, et de création d'interfaces graphiques conviviales, incluant des mises à jour dynamiques de l'interface utilisateur.

Installation des modules Tkinter, Requests, Pillow et Webbrowser

Pour bâtir cette application de recherche culinaire, l'emploi de Tkinter, Requests, PIL, ainsi que du module Webbrowser est indispensable. Tkinter permet la création d'applications de bureau, offrant une variété de widgets qui facilitent la mise en place d'interfaces graphiques intuitives. Pour l'installation de Tkinter, veuillez ouvrir votre terminal et exécuter la commande suivante :

 pip install tkinter 

Le module Requests simplifie grandement la formulation de requêtes HTTP et génère un objet de réponse contenant des données telles que l'encodage et le statut. Vous pouvez l'utiliser pour récupérer les données d'identification de l'appelant, concevoir un vérificateur de statut de site web, un convertisseur de devises, ou encore une application d'actualités. Afin d'installer le module Requests, veuillez ouvrir votre terminal et exécuter la commande suivante :

 pip install requests 

La bibliothèque Pillow, une ramification de la Python Imaging Library (PIL), offre des capacités de traitement d'image poussées qui simplifient l'édition, la création, la conversion de formats de fichiers, ainsi que l'enregistrement d'images. Pour installer Pillow, veuillez ouvrir votre terminal et y exécuter la commande suivante :

 pip install Pillow 

Le module Webbrowser, quant à lui, vous permet d'ouvrir n'importe quel lien dans votre navigateur par défaut. Il est intégré à la bibliothèque standard de Python, et ne requiert donc pas d'installation externe.

Génération d'une clé API Edamam pour la recherche de recettes

Pour obtenir votre clé API Edamam Recipe Search, veuillez suivre ces étapes :

  • Rendez-vous sur Edamam et cliquez sur le bouton "Signup API". Complétez les informations requises et optez pour le plan "API de recherche de recettes – Développeur".
  • Connectez-vous à votre compte, cliquez sur le bouton "Comptes", puis sur "Aller au tableau de bord".
  • Ensuite, cliquez sur l'onglet "Applications" puis sur le bouton "Afficher" associé à l'API de recherche de recettes.
  • Copiez l'identifiant de l'application ainsi que les clés d'application, et conservez-les précieusement pour une utilisation ultérieure dans votre application.

Conception de la fonctionnalité pour récupérer les 5 meilleures recettes

Le code source complet pour la création de l'application de recherche de recettes via Python est disponible dans ce dépôt GitHub.

Commencez par importer les modules indispensables. Définissez une méthode get_top_5_recipes() qui récupère les titres, les images et les liens des cinq recettes les plus pertinentes en fonction du plat saisi par l'utilisateur. Utilisez la méthode get() pour extraire le nom du plat recherché.

Si l'utilisateur a saisi un nom de recette, définissez l'URL de base pour le point de terminaison de recherche de recette de l'API Edamam. Transmettez l'app_id et l'app_key que vous avez copiés précédemment pour authentifier et autoriser les demandes d'API.

 import tkinter as tk
import requests
from PIL import Image, ImageTk
import webbrowser

def get_top_5_recipes():
    recipe_name = entry_recipe_name.get()
    if recipe_name:
        api_url = "https://api.edamam.com/search"
        app_id =
        app_key =

Créez un dictionnaire, params, contenant les différents paramètres nécessaires à la requête API. Définissez les paires clé-valeur pour q, app_id et app_key en utilisant les valeurs précédemment obtenues. Ajustez les paramètres from et to en fonction du nombre de résultats souhaité.

Envoyez une requête GET à l'API Edamam, combinant l'URL de l'API et le dictionnaire de paramètres. Stockez la réponse et extrayez-la au format JSON. Faites appel à la fonction clear_recipe_list() pour effacer les recettes affichées lors des requêtes précédentes.

         params = {
            "q": recipe_name,
            "app_id": app_id,
            "app_key": app_key,
            "from": 0,
            "to": 5,
        }

        response = requests.get(api_url, params=params)
        data = response.json()
        clear_recipe_list()

Vérifiez si la clé hits est présente dans les données JSON extraites et si elle contient le résultat de la recherche. Si c'est le cas, parcourez les résultats et extrayez les informations de chaque recette. Envoyez une requête GET à l'URL de l'image en définissant le paramètre de flux sur True pour permettre le téléchargement progressif des données d'image.

Utilisez la classe Image du module Pillow pour ouvrir l'image reçue. Redimensionnez-la à 200 pixels de hauteur et de largeur en utilisant la méthode de rééchantillonnage de Lanczos pour une haute qualité. Convertissez-la en PhotoImage compatible avec Tkinter pour l'affichage sur l'interface utilisateur.

         if "hits" in data and data["hits"]:
            for i, hit in enumerate(data["hits"]):
                recipe = hit["recipe"]
                recipe_list.append(recipe)
                recipe_name = recipe["label"]
                recipe_link = recipe["url"]
                image_url = recipe["image"]

                image_response = requests.get(image_url, stream=True)
                image = Image.open(image_response.raw)
                image = image.resize((200, 200), Image.LANCZOS)
                photo_image = ImageTk.PhotoImage(image)

Architecture de l'application

Créez trois étiquettes pour afficher respectivement le titre, l'image, et le lien vers la recette. Indiquez la fenêtre parente où les étiquettes doivent être affichées, le texte à afficher, ainsi que le style de police. Pour l'image, définissez l'attribut image sur photo_image. Réglez l'option du curseur de l'étiquette de lien sur hand2 pour la rendre cliquable.

Liez le lien et l'événement de clic gauche de la souris pour invoquer la fonction open_link(). Disposez tous les widgets en utilisant la méthode pack, en les centrant horizontalement et en ajoutant un espacement si nécessaire. Ajoutez les titres, les images, et les liens dans trois listes distinctes.

                 recipe_title_label = tk.Label(
                   canvas_frame,
                   text=f"{i+1}. {recipe_name}",
                   font=("Helvetica", 12, "bold"),
               )
               recipe_title_label.pack(pady=(5, 0), anchor=tk.CENTER)

               image_response = requests.get(image_url, stream=True)
               image = Image.open(image_response.raw)
               image = image.resize((200, 200), Image.LANCZOS)
               photo_image = ImageTk.PhotoImage(image)
               image_label = tk.Label(canvas_frame, image=photo_image)
               image_label.image = photo_image
               image_label.pack(pady=(0, 5), anchor=tk.CENTER)

               link_label = tk.Label(
                   canvas_frame, text=recipe_link, fg="blue", cursor="hand2"
               )
               link_label.pack(pady=(0, 10), anchor=tk.CENTER)
               link_label.bind(
                   "<Button-1>", lambda event, link=recipe_link: open_link(link)
               )

               recipe_labels.append(recipe_title_label)
               recipe_images.append(photo_image)
               recipe_links.append(link_label)

Définissez une méthode clear_recipe_list() pour éliminer tout le contenu affiché à l'écran suite à une requête précédente. Effacez le contenu de la liste de recettes, et parcourez chaque étiquette de la liste d'étiquettes de recette.

Utilisez la méthode pack_forget() pour supprimer l'étiquette de l'affichage, tout en conservant l'objet widget intact.

Effacez la liste des étiquettes de recettes afin d'accueillir de nouvelles données. Répétez ce processus pour les images et les liens. Créez une méthode open_link() pour ouvrir le lien de la recette dans le navigateur web par défaut.

 def clear_recipe_list():
    recipe_list.clear()
    for label in recipe_labels:
        label.pack_forget()
    recipe_labels.clear()
    for image_label in recipe_images:
        image_label.pack_forget()
    recipe_images.clear()
    for link_label in recipe_links:
        link_label.pack_forget()
    recipe_links.clear()

def open_link(link):
    webbrowser.open(link)

Initialisez la fenêtre racine de Tkinter. Définissez le titre, les dimensions, et la couleur de fond de l'application. Créez un widget de cadre et définissez son élément parent avec sa couleur de fond. Ajoutez une étiquette, un champ de saisie, ainsi qu'un bouton de recherche. Disposez tous les widgets en utilisant la méthode pack et en ajoutant un espacement si nécessaire.

 root = tk.Tk()
root.title("Recipe Finder")
root.geometry("600x600")
root.configure(bg="#F1F1F1")

frame = tk.Frame(root, bg="#F1F1F1")
frame.pack(fill=tk.BOTH, expand=tk.YES, padx=20, pady=20)

label_recipe_name = tk.Label(
   frame, text="Enter Recipe Name:", font=("Helvetica", 14, "bold"), bg="#F1F1F1"
)
label_recipe_name.pack()

entry_recipe_name = tk.Entry(frame, font=("Helvetica", 12))
entry_recipe_name.pack(pady=5)

search_button = tk.Button(
   frame,
   text="Search Recipes",
   font=("Helvetica", 12, "bold"),
   command=get_top_5_recipes,
)
search_button.pack(pady=10)

Créez un canevas avec un fond blanc pour l'affichage des widgets contenant les informations sur la recette. Disposez-le sur le côté gauche de la fenêtre, en occupant tout l'espace disponible dans le cadre et en s'étendant lors du redimensionnement.

Créez une barre de défilement verticale pour le canevas, et positionnez-la sur son côté droit. Associez la méthode scrollbar.set à la méthode canvas.yview pour que le défilement de la barre de défilement fasse défiler le contenu du canevas.

Créez un cadre à l'intérieur du canevas, servant de conteneur pour les éléments de la recette. Ancrez ce cadre en haut à gauche de la fenêtre. Liez l'événement <Configure> afin qu'il garantisse que la boîte puisse défiler correctement lorsque son contenu est modifié ou redimensionné.

 canvas = tk.Canvas(frame, bg="white")
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=tk.YES)

scrollbar = tk.Scrollbar(frame, orient=tk.VERTICAL, command=canvas.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
canvas.configure(yscrollcommand=scrollbar.set)

canvas_frame = tk.Frame(canvas, bg="white")
canvas.create_window((0, 0), window=canvas_frame, anchor=tk.NW)
canvas_frame.bind(
   "<Configure>", lambda event: canvas.configure(scrollregion=canvas.bbox("all"))
)

Définissez les listes pour les recettes, les étiquettes, les images, et les liens. La fonction mainloop() indique à Python de lancer la boucle d'événements Tkinter et d'écouter les événements jusqu'à ce que la fenêtre soit fermée.

 recipe_list = []
recipe_labels = []
recipe_images = []
recipe_links = []

root.mainloop()

Assemblez le tout et partez à la découverte culinaire en un clic.

Résultat de l'application de recherche de recettes

En exécutant le programme et en saisissant un plat tel que "Chicken Burger", vous obtiendrez les cinq résultats les plus pertinents. Ceux-ci comprendront le titre, l'image, et le lien vers la recette du plat spécifié. En cliquant sur le lien, votre navigateur web par défaut ouvrira la page correspondante. Le défilement permet de consulter tous les résultats, centrés horizontalement.

Amélioration de l'application de recherche de recettes

Pour enrichir votre application de recherche de recettes, il est possible d'implémenter des fonctions de filtrage et de tri en fonction de divers critères. Vous pourriez filtrer un plat par régime alimentaire, temps de cuisson, ou type de cuisine, et les trier selon l'ordre souhaité.

Ajoutez une fonctionnalité permettant de mettre en favoris vos recettes préférées, ainsi qu'une option de partage sur les réseaux sociaux. Vous pourriez également implémenter une catégorie dédiée à la découverte des plats les plus recherchés ou les plus sauvegardés.

En combinant vos compétences en programmation et la puissance des API, cette application de base peut être transformée en une solution complète et sophistiquée.

Auteur
France

Rédacteur tech, guides pratiques et astuces numériques.