Jak zbudować aplikację do wyszukiwania przepisów za pomocą Pythona

Przy obfitości przepisów rozsianych po całym Internecie, z setkami linków i reklam, znalezienie idealnego przepisu może być wyzwaniem. Zbudowanie aplikacji do wyszukiwania przepisów zapewnia dostosowane i przyjazne dla użytkownika doświadczenie oraz spójny projekt, eliminując wszystkie nieistotne wyniki i elementy rozpraszające uwagę

.Tworząc tę ​​aplikację, wyostrzysz swoje umiejętności w zakresie żądań HTTP, zarządzania kluczami API, manipulowania obrazami i tworzenia graficznych interfejsów użytkownika, w tym dynamicznej aktualizacji GUI.

Zainstaluj moduł Tkinter, Requests, Pillow i Webbrowser

Aby zbudować aplikację do wyszukiwania przepisów, potrzebujesz Tkinter, Requests, PIL i modułu Webbrowser. Tkinter umożliwia tworzenie aplikacji desktopowych. Oferuje różnorodne widżety, które ułatwiają tworzenie GUI. Aby zainstalować Tkintera, otwórz terminal i uruchom:

 pip install tkinter 

Moduł Requests ułatwia wykonywanie żądań HTTP i zwracanie obiektu odpowiedzi zawierającego dane, takie jak kodowanie i status. Możesz go użyć do pobrania informacji o identyfikatorze dzwoniącego, stworzenia sprawdzania statusu strony internetowej, przelicznika walut lub aplikacji informacyjnej. Aby zainstalować moduł Requests, otwórz terminal i uruchom:

 pip install requests 

Biblioteka Pillow — rozwidlenie biblioteki Python Imaging Library (PIL) — zapewnia możliwości przetwarzania obrazu, które pomagają w edytowaniu, tworzeniu, konwertowaniu formatów plików i zapisywaniu obrazów. Aby zainstalować moduł Pillow, otwórz terminal i uruchom:

 pip install Pillow 

Moduł przeglądarki internetowej pomaga otworzyć dowolny link w domyślnej przeglądarce. Jest częścią standardowej biblioteki Pythona. Dlatego nie musisz instalować go na zewnątrz.

Aby wygenerować klucz API Edamam Recipe Search, wykonaj następujące kroki:

  • Odwiedzać Edamam i kliknij przycisk Signup API. Podaj szczegóły i wybierz swój plan jako Recipe Search API – Developer.
  • Zaloguj się do swojego konta, kliknij przycisk Konta, a następnie kliknij przycisk Przejdź do pulpitu nawigacyjnego.
  • Następnie kliknij kartę Aplikacje i na koniec kliknij przycisk Widok obok Recipe Search API.
  • Skopiuj identyfikator aplikacji i klucze aplikacji i zapisz je do użycia w aplikacji.
  • Budowanie funkcjonalności w celu uzyskania 5 najlepszych przepisów

    Możesz znaleźć cały kod źródłowy do budowania aplikacji do wyszukiwania przepisów przy użyciu Pythona w tym Repozytorium GitHub.

    Zaimportuj wymagane moduły. Zdefiniuj metodę get_top_5_recipes(), która pobiera tytuły pięciu przepisów, obrazy i linki do potrawy, której szuka użytkownik. Użyj funkcji get(), aby wyodrębnić nazwę potrawy, której szukał użytkownik.

    Jeśli użytkownik wprowadził nazwę przepisu, zdefiniuj podstawowy adres URL dla punktu końcowego wyszukiwania receptur interfejsu Edamam API. Przekaż skopiowane wcześniej identyfikatory aplikacji i klucze aplikacji, aby uwierzytelniać i autoryzować żądania interfejsu 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 =

    Utwórz słownik, params, który zawiera różne parametry, które musisz przekazać w ramach żądania API. Ustaw pary klucz-wartość dla q, app_id i app_key na wartości otrzymane wcześniej. Ustaw parametry od i do, aby odzwierciedlić liczbę wyników, które chcesz zobaczyć.

    Wyślij żądanie GET do interfejsu API Edamam, łącząc adres URL interfejsu API i słownik params. Zapisz odpowiedź i wyodrębnij ją w formacie JSON. Wywołaj metodę clear_recipe_list() , aby usunąć przepisy obecne na ekranie z wcześniejszych żądań.

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

    Sprawdź, czy klucz, hits jest obecny w wyodrębnionych danych JSON i czy zawiera wynik wyszukiwania. Jeśli tak, przejrzyj wyniki wyszukiwania i wyodrębnij informacje o przepisie jeden po drugim. Wyślij żądanie GET do adresu URL obrazu z parametrem stream ustawionym na True, aby umożliwić przesyłanie strumieniowe danych obrazu.

    Użyj klasy Image modułu Pillow, aby otworzyć otrzymany obraz. Zmień jego rozmiar, aby miał wysokość i szerokość 200 pikseli, używając metody ponownego próbkowania Lanczosa w celu uzyskania wysokiej jakości zmiany rozmiaru. Przekonwertuj to na zdjęcie PhotoImage zgodne z Tkinter, aby wyświetlić je w graficznym interfejsie użytkownika.

             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)

    Budowanie struktury aplikacji

    Zdefiniuj trzy etykiety, aby wyświetlić tytuł przepisu, obraz i łącze do przepisu. Ustaw okno nadrzędne, w którym chcesz go umieścić, tekst, który chcesz wyświetlić, oraz styl czcionki, jaki powinien mieć. Aby wyświetlić obraz, ustaw atrybut image na photo_image. Ustaw opcję kursora w etykiecie linku na hand2, aby można było go kliknąć.

    Powiąż łącze i zdarzenie kliknięcia lewym przyciskiem myszy, aby wywołać funkcję open_link(). Uporządkuj wszystkie widżety za pomocą metody pakowania, wyśrodkuj je poziomo i dodaj dopełnienie w razie potrzeby. Dołącz tytuł, obrazy i linki do trzech różnych list.

                     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)

    Zdefiniuj metodę clear_recipe_list() w celu wyczyszczenia całej zawartości ekranu wygenerowanej przez poprzednie żądanie. Wyczyść zawartość listy przepisów i przejrzyj każdą etykietę na liście „etykieta_przepisu”.

    Wywołanie metody pack_forget() w celu usunięcia etykiety z wyświetlacza, ale zachowanie obiektu widżetu w stanie nienaruszonym.

    Wyczyść listę receptur_etykiet dla nowych danych. Powtórz ten proces również dla obrazów i linków. Zdefiniuj metodę open_link(), aby otworzyć link do przepisu w domyślnej przeglądarce internetowej.

     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)

    Zainicjuj okno główne Tkintera. Ustaw tytuł, wymiary i kolor tła aplikacji. Zdefiniuj widżet ramki i ustaw jego element nadrzędny wraz z kolorem tła. Utwórz etykietę, wpis i przycisk wyszukiwania. Uporządkuj wszystkie widżety za pomocą metody pakowania i dodaj dopełnienie w razie potrzeby.

     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)

    Utwórz płótno z białym tłem, aby wyświetlić widżety zawierające informacje o recepturze. Zorganizuj go po lewej stronie okna, zajmując całą przestrzeń w ramce w obu kierunkach i powiększając ją przy zmianie rozmiaru.

    Utwórz pionowy pasek przewijania dla płótna i umieść go po jego prawej stronie. Połącz metodę scrollbar.set z metodą canvas.yview, aby przewijanie paska przewijania przewijało zawartość płótna.

    Utwórz ramkę wewnątrz płótna, która będzie działać jako pojemnik na pozycje przepisu, zakotwiczając w lewym górnym rogu okna. Powiąż zdarzenie w taki sposób, aby zapewnić prawidłowe przewijanie pola po zmianie jego zawartości lub zmianie rozmiaru.

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

    Zdefiniuj listę przepisów, etykiet, obrazów i łączy. Funkcja mainloop() mówi Pythonowi, aby uruchomił pętlę zdarzeń Tkinter i nasłuchiwał zdarzeń, dopóki nie zamkniesz okna.

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

    root.mainloop()

    Połącz to wszystko i odkrywaj kuchnie jednym kliknięciem.

    Dane wyjściowe aplikacji Wyszukiwarka przepisów

    Po uruchomieniu programu i wprowadzeniu dania jako Chicken Burger otrzymujesz pięć najlepszych wyników. Zawiera tytuł, obraz i link do przepisu wprowadzonej potrawy. Po kliknięciu łącza domyślna przeglądarka internetowa otwiera łącze przepisu. Podczas przewijania w dół rozmiar zawartości pozostaje taki sam i wyświetla różne wyniki wyśrodkowane w poziomie.

    Ulepszenie aplikacji Wyszukiwarka przepisów

    Aby udoskonalić aplikację do wyszukiwania przepisów, możesz zaimplementować filtrowanie i sortowanie zgodnie z różnymi preferencjami. Danie można filtrować według preferencji żywieniowych, czasu gotowania i rodzaju kuchni oraz sortować je w dowolnej kolejności.

    Utwórz funkcję tworzenia zakładek do ulubionych przepisów, aby wyświetlić je później, oraz opcję udostępniania ich w mediach społecznościowych. Możesz utworzyć kategorię, aby odkryć najczęściej wyszukiwane potrawy, najczęściej dodawane do zakładek i tak dalej.

    Łącząc swoje umiejętności programistyczne i zaawansowane funkcje interfejsów API, możesz dalej przekształcać tę podstawową aplikację w pełnoprawną.