2023-08-13 14:16 Doba čtení: 14 min

Jak vytvořit aplikaci Recipe Finder pomocí Pythonu

Hledání ideálního receptu může být oříšek, když internet zahlcují stovky odkazů a reklam. Aplikace pro vyhledávání receptů však nabízí personalizované a uživatelsky příjemné rozhraní. Díky konzistentnímu designu se vyhnete nepodstatným výsledkům a rušivým prvkům.

Vývojem této aplikace zdokonalíte své dovednosti v oblasti HTTP požadavků, správy API klíčů, manipulace s obrázky a tvorby grafických rozhraní, včetně dynamické aktualizace GUI.

Instalace modulů Tkinter, Requests, Pillow a Webbrowser

Pro vytvoření aplikace na vyhledávání receptů budete potřebovat moduly Tkinter, Requests, PIL a Webbrowser. Tkinter vám umožňuje vytvářet desktopové aplikace, nabízí řadu widgetů pro snadný vývoj GUI. Pro instalaci Tkinteru otevřete terminál a zadejte:

 pip install tkinter 

Modul Requests usnadňuje vytváření HTTP požadavků a vrací objekt odpovědi obsahující data, jako je kódování a stav. Lze jej využít k načítání informací o volajícím, kontrole stavu webu, převodu měn nebo pro zpravodajské aplikace. Pro instalaci modulu Requests zadejte v terminálu:

 pip install requests 

Knihovna Pillow, odnož Python Imaging Library (PIL), nabízí nástroje pro zpracování obrázků, úpravy, tvorbu, převod formátů a ukládání obrázků. Pro instalaci modulu Pillow zadejte v terminálu:

 pip install Pillow 

Modul Webbrowser, který je součástí standardní knihovny Pythonu, umožňuje otevírat odkazy ve výchozím prohlížeči. Není tedy nutná jeho externí instalace.

Získání API klíče Edamam pro vyhledávání receptů

Pro vygenerování API klíče Edamam Recipe Search postupujte podle následujících kroků:

  • Navštivte Edamam a klikněte na tlačítko Signup API. Vyplňte formulář a zvolte plán Recipe Search API – Developer.
  • Přihlaste se ke svému účtu, klikněte na „Účty“ a poté na tlačítko „Přejít na řídicí panel“.
  • Následně klikněte na záložku „Aplikace“ a poté na tlačítko „Zobrazit“ vedle Recipe Search API.
  • Zkopírujte ID aplikace a aplikační klíč a uložte si je pro použití v aplikaci.
  • Implementace funkce pro získání 5 nejlepších receptů

    Kompletní zdrojový kód pro tvorbu aplikace pro vyhledávání receptů pomocí Pythonu naleznete v tomto GitHub repozitáři.

    Importujte potřebné moduly. Definujte metodu `get_top_5_recipes()`, která získá prvních pět názvů receptů, obrázky a odkazy na jídlo, které uživatel hledá. Pomocí metody `get()` extrahujte název jídla zadaný uživatelem.

    Pokud uživatel zadal název receptu, definujte základní URL pro koncový bod vyhledávání receptů v API Edamam. Předejte `app_id` a `app_key`, které jste si dříve zkopírovali, pro ověření a autorizaci požadavků 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 =

    Vytvořte slovník `params`, který bude obsahovat různé parametry nutné pro odeslání API požadavku. Nastavte páry klíč-hodnota pro `q`, `app_id` a `app_key` na hodnoty, které jste dříve získali. Parametry `from` a `to` nastavte tak, aby odpovídaly požadovanému počtu výsledků.

    Odešlete GET požadavek na Edamam API, kombinující URL API a slovník parametrů. Uložte odpověď a extrahujte data ve formátu JSON. Zavolejte funkci `clear_recipe_list()` pro vymazání receptů z předchozích požadavků na obrazovce.

             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()

    Zkontrolujte, zda data JSON obsahují klíč `hits` a zda obsahují výsledky vyhledávání. Pokud ano, iterujte výsledky a extrahujte informace o receptu jeden po druhém. Odešlete GET požadavek na URL obrázku s parametrem `stream` nastaveným na True pro umožnění streamování dat obrázku.

    Použijte třídu `Image` modulu Pillow pro otevření přijatého obrázku. Změňte jeho velikost na 200x200 pixelů pomocí metody `LANCZOS` pro kvalitní změnu velikosti. Převeďte ho na `PhotoImage` kompatibilní s Tkinterem pro zobrazení v GUI.

             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)

    Vytvoření struktury aplikace

    Definujte tři popisky pro zobrazení názvu receptu, obrázku a odkazu na recept. Nastavte nadřazené okno, text, který chcete zobrazit, a styl písma. Pro zobrazení obrázku nastavte atribut `image` na `photo_image`. Nastavte možnost kurzoru na popisku odkazu na `hand2`, aby se dalo kliknout.

    Propojte odkaz a událost kliknutí levým tlačítkem myši s funkcí `open_link()`. Uspořádejte všechny widgety pomocí metody `pack`, vycentrujte je vodorovně a podle potřeby přidejte výplň. Přidejte název, obrázek a odkaz do tří různých seznamů.

                     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)

    Definujte metodu `clear_recipe_list()` pro vymazání celého obsahu obrazovky, který byl vygenerován předchozím požadavkem. Vymažte obsah seznamu receptů a iterujte přes každý popisek v seznamu receptů.

    Zavolejte metodu `pack_forget()` pro odstranění popisku ze zobrazení, ale zachování objektu widgetu beze změny.

    Vymažte seznam popisků receptů pro nová data. Stejný postup opakujte pro obrázky a odkazy. Definujte metodu `open_link()` pro otevření odkazu na recept ve výchozím webovém prohlížeči.

     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)

    Inicializujte kořenové okno Tkinter. Nastavte název, rozměry a barvu pozadí aplikace. Definujte widget rámečku a nastavte jeho nadřazený prvek a barvu pozadí. Vytvořte popisky, položku a tlačítko pro vyhledávání. Uspořádejte všechny widgety pomocí metody `pack` a přidejte potřebné odsazení.

     root = tk.Tk()
    root.title("Vyhledávač receptů")
    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="Zadejte název receptu:", 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="Hledat recepty",
       font=("Helvetica", 12, "bold"),
       command=get_top_5_recipes,
    )
    search_button.pack(pady=10)

    Vytvořte plátno s bílým pozadím pro zobrazení widgetů obsahujících informace o receptu. Umístěte ho na levou stranu okna, zabere veškerý prostor v rámu v obou směrech a roztáhne se při změně velikosti.

    Vytvořte svislý posuvník pro plátno a umístěte jej na pravou stranu. Propojte metodu `scrollbar.set` s metodou `canvas.yview` pro posouvání obsahu plátna pomocí posuvníku.

    Vytvořte rámeček uvnitř plátna, který bude fungovat jako kontejner pro položky receptů, ukotvený v levém horním rohu okna. Propojte událost `` s funkcí, která zajistí správné posouvání obsahu při změně jeho velikosti.

     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"))
    )

    Definujte seznamy receptů, popisků, obrázků a odkazů. Funkce `mainloop()` říká Pythonu, aby spustil smyčku událostí Tkinter a naslouchal událostem, dokud okno nezavřete.

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

    root.mainloop()

    Využijte všechny tyto kroky a objevujte kuchyně jediným kliknutím.

    Výstup z aplikace Vyhledávač receptů

    Po spuštění programu a zadání pokrmu, například "Kuřecí burger", se zobrazí pět nejlepších výsledků. Zobrazí se název, obrázek a odkaz na recept. Po kliknutí na odkaz se otevře odkaz v defaultním webovém prohlížeči. Při posouvání dolů zůstává velikost obsahu zachována a výsledky se zobrazují horizontálně vycentrované.

    Vylepšení aplikace Vyhledávač receptů

    Pro zdokonalení vaší aplikace pro vyhledávání receptů můžete implementovat filtrování a řazení dle různých preferencí. Pokrmy můžete filtrovat podle dietních požadavků, doby vaření, kuchyně a seřadit je v libovolném pořadí.

    Vytvořte funkci pro přidávání oblíbených receptů do záložek, abyste si je mohli prohlédnout později, a možnost sdílení na sociálních sítích. Můžete vytvořit kategorii pro objevování nejvyhledávanějších jídel, nejčastěji ukládaných do záložek a tak dále.

    Spojením vašich programovacích dovedností s výkonnými funkcemi API můžete tuto základní aplikaci dále rozvinout v plnohodnotný nástroj.

    Jan Novák
    Autor
    Czechia

    Redaktor zaměřený na Windows, produktivitu a cloudové nástroje.

    Předchozí článek
    Co je zabezpečení sítě? Jak to funguje a proč je to důležité
    Další článek
    Chrání vás vypnutí telefonu Android před malwarem?