Як створити програму пошуку рецептів за допомогою Python

З великою кількістю рецептів, розкиданих по всьому Інтернету, із сотнями посилань і реклами, знайти ідеальний рецепт може бути складно. Створення програми пошуку рецептів надасть вам індивідуальний і зручний досвід і послідовний дизайн, усуваючи всі нерелевантні результати та відволікаючі фактори

. Створивши цю програму, ви вдосконалите свої навички щодо HTTP-запитів, керування ключами API, роботи із зображеннями та створення графічних інтерфейсів користувача, включаючи динамічне оновлення GUI.

Встановіть Tkinter, Requests, Pillow і модуль веб-браузера

Щоб створити програму пошуку рецептів, вам знадобляться Tkinter, Requests, PIL і модуль Webbrowser. Tkinter дозволяє створювати настільні програми. Він пропонує різноманітні віджети, які полегшують розробку GUI. Щоб встановити Tkinter, відкрийте термінал і запустіть:

 pip install tkinter 

Модуль Requests спрощує створення HTTP-запитів і повернення об’єкта відповіді, який містить такі дані, як кодування та статус. Ви можете використовувати його, щоб отримати інформацію про ідентифікатор абонента, створити засіб перевірки статусу веб-сайту, конвертер валют або програму новин. Щоб встановити модуль Requests, відкрийте термінал і запустіть:

 pip install requests 

Бібліотека Pillow — розгалуження бібліотеки Python Imaging Library (PIL) — надає можливості обробки зображень, які допомагають редагувати, створювати, перетворювати формати файлів і зберігати зображення. Щоб встановити модуль Pillow, відкрийте термінал і запустіть:

 pip install Pillow 

Модуль веб-браузера допомагає відкривати будь-яке посилання у браузері за умовчанням. Це частина стандартної бібліотеки Python. Тому вам не потрібно встановлювати його зовні.

Щоб створити ключ API Edamam Recipe Search, виконайте такі дії:

  • Відвідайте Едамам і натисніть кнопку Signup API. Заповніть деталі та виберіть свій план як API пошуку рецептів – розробник.
  • Увійдіть у свій обліковий запис, натисніть кнопку «Облікові записи», а потім натисніть кнопку «Перейти до інформаційної панелі».
  • Після цього клацніть вкладку «Програми» і, нарешті, клацніть кнопку «Перегляд» поруч із API пошуку рецептів.
  • Скопіюйте ідентифікатор програми та ключі програми та збережіть їх для використання у своїй програмі.
  •   9 Голосовий сервер для особистого чи бізнес-хостингу [Teamspeak, Mumble, Lavalink]

    Створення функціональних можливостей для отримання 5 найкращих рецептів

    Тут ви можете знайти повний вихідний код для створення програми пошуку рецептів за допомогою Python Репозиторій GitHub.

    Імпортуйте необхідні модулі. Визначте метод get_top_5_recipes(), який отримує назви п’яти найкращих рецептів, зображення та посилання на страву, яку шукає користувач. Використовуйте get(), щоб отримати назву страви, яку шукав користувач.

    Якщо користувач ввів назву рецепта, визначте базову URL-адресу для кінцевої точки пошуку рецептів Edamam API. Передайте app_id і app_key, які ви скопіювали раніше, щоб автентифікувати та авторизувати запити 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 =

    Створіть словник params, який містить різні параметри, які потрібно передати як частину запиту API. Встановіть пари ключ-значення для q, app_id і app_key на значення, які ви отримали раніше. Встановіть параметри from і to, щоб відобразити кількість результатів, які ви хочете побачити.

    Надішліть запит GET до API Edamam, поєднуючи URL-адресу API та словник параметрів. Збережіть відповідь і розпакуйте її у форматі JSON. Викличте clear_recipe_list(), щоб очистити наявні на екрані рецепти з попередніх запитів.

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

    Перевірте, чи ключ, звернення присутній у видобутих даних JSON і чи містять вони результат пошуку. Якщо так, перегляньте результати пошуку та витягніть інформацію про рецепт один за одним. Щоб дозволити потокове передавання даних зображення, надішліть запит GET на URL-адресу зображення з параметром потоку, встановленим у значення True.

    Використовуйте клас Image модуля Pillow, щоб відкрити отримане зображення. Змініть його розмір, щоб мати висоту та ширину 200 пікселів, використовуючи метод повторної вибірки Lanczos для високоякісного зміни розміру. Перетворіть це на Tkinter-сумісний PhotoImage, щоб відобразити його в графічному інтерфейсі користувача.

             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)

    Побудова структури програми

    Визначте три мітки для відображення назви рецепта, зображення та посилання на рецепт. Установіть батьківське вікно, у якому ви хочете його розмістити, текст, який ви хочете відобразити, і стиль шрифту, який він має мати. Щоб відобразити зображення, установіть для атрибута image значення photo_image. Установіть параметр курсора в мітці посилання на hand2, щоб зробити його доступним для натискання.

      9 найкращих інструментів очищення зображень для ідеально полірованих фотографій

    Зв’яжіть посилання та подію клацання лівою кнопкою миші, щоб викликати функцію open_link(). Упорядкуйте всі віджети за допомогою методу pack, відцентруйте їх горизонтально та за потреби додайте відступи. Додайте назву, зображення та посилання до трьох різних списків.

                     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)

    Визначте метод clear_recipe_list(), щоб очистити весь вміст екрана, згенерований попереднім запитом. Очистіть вміст списку рецептів і повторіть кожну мітку в списку recipe_label.

    Виклик методу pack_forget() для видалення мітки з дисплея, але збереження об’єкта віджета недоторканим.

    Очистіть список recipe_labels для нових даних. Повторіть цей процес також для зображень і посилань. Визначте метод open_link(), щоб відкрити посилання на рецепт у вашому браузері за умовчанням.

     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)

    Ініціалізуйте кореневе вікно Tkinter. Встановіть назву, розміри та колір фону програми. Визначте рамковий віджет і встановіть його батьківський елемент разом із кольором фону. Створіть мітку, запис і кнопку пошуку. Упорядкуйте всі віджети за допомогою методу pack і за потреби додайте відступи.

     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)

    Створіть полотно з білим фоном для відображення віджетів, що містять інформацію про рецепти. Розмістіть його в лівій частині вікна, зайнявши весь простір у рамці в обох напрямках і розширивши його при зміні розміру.

      5 найкращих систем DDI/IPAM для вирішення проблеми з IP-адресацією

    Створіть вертикальну смугу прокрутки для полотна та розмістіть її з правого боку. Пов’яжіть метод scrollbar.set з методом canvas.yview, щоб прокручування смуги прокручування прокручувало вміст полотна.

    Створіть рамку всередині полотна, яка буде служити контейнером для елементів рецепту, закріпивши її у верхньому лівому куті вікна. Прив’яжіть подію так, щоб вона забезпечувала правильну прокрутку поля, коли його вміст змінюється або змінюється розмір.

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

    Визначте список для рецептів, міток, зображень і посилань. Функція mainloop() повідомляє Python запускати цикл подій Tkinter і прослуховувати події, поки ви не закриєте вікно.

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

    root.mainloop()

    Зберіть усе разом і відкривайте кухні одним натисканням кнопки.

    Результат програми пошуку рецептів

    Запустивши програму та ввівши страву як Chicken Burger, ви отримаєте п’ять найкращих результатів. Він містить назву, зображення та посилання на рецепт страви, яку ви ввели. Після натискання на посилання веб-браузер за замовчуванням відкриває посилання на рецепт. Під час прокручування вниз розмір вмісту залишається незмінним і відображає різні результати в центрі по горизонталі.

    Покращення програми «Пошук рецептів».

    Щоб покращити програму пошуку рецептів, ви можете реалізувати фільтрування та сортування відповідно до різних уподобань. Ви можете відфільтрувати страву за дієтичними перевагами, часом приготування та кухнею та сортувати їх у будь-якому порядку.

    Створіть функцію, щоб додати улюблені рецепти в закладки для перегляду пізніше, а також можливість поділитися ними в соціальних мережах. Ви можете створити категорію, щоб знайти страви, які найчастіше шукають, найчастіше додають у закладки тощо.

    Поєднавши свої навички програмування та потужні функції API, ви зможете перетворити цю базову програму на повноцінну.