У безмежному просторі інтернету, де розкидано незліченну кількість кулінарних рецептів, часто буває складно віднайти той ідеальний варіант. Безліч посилань, реклами та зайвої інформації можуть відволікати та ускладнювати пошук. Створення власної програми для пошуку рецептів – це чудовий спосіб отримати персоналізований досвід, зручний інтерфейс та відфільтрувати нерелевантні результати. Розробка такої програми дозволить вам вдосконалити свої вміння в роботі з HTTP-запитами, керуванні API-ключами, обробці зображень та створенні графічних інтерфейсів користувача, включаючи динамічне оновлення інтерфейсу.
Необхідні інструменти: встановлення Tkinter, Requests, Pillow та Webbrowser
Для створення програми вам знадобляться такі бібліотеки: Tkinter, Requests, Pillow (PIL) та модуль Webbrowser. Tkinter надає можливість створювати настільні програми з різноманітними віджетами, що полегшують розробку графічного інтерфейсу. Для встановлення Tkinter відкрийте термінал і введіть:
pip install tkinter
Модуль Requests спрощує відправку HTTP-запитів та отримання об’єктів відповідей, які містять корисну інформацію, наприклад, кодування та статус. Його можна використовувати для різних задач, наприклад, отримання даних про ідентифікатор абонента, перевірки статусу веб-сайту, конвертації валют або отримання новин. Щоб встановити модуль Requests, введіть у терміналі:
pip install requests
Бібліотека Pillow – це відгалуження від Python Imaging Library (PIL), що надає широкі можливості обробки зображень: редагування, створення, конвертація форматів файлів та збереження. Для встановлення Pillow введіть у терміналі:
pip install Pillow
Модуль Webbrowser допомагає відкривати будь-які посилання в браузері за замовчуванням. Він є частиною стандартної бібліотеки Python, тому його не потрібно встановлювати окремо.
Отримання API-ключа Edamam для пошуку рецептів
Щоб отримати API-ключ Edamam для пошуку рецептів, виконайте наступні кроки:
- Перейдіть на сайт Edamam та натисніть кнопку “Signup API”. Заповніть необхідні дані та виберіть план “Recipe Search API – Developer”.
- Увійдіть у свій аккаунт, перейдіть у розділ “Accounts”, а потім на “Go to Dashboard”.
- Перейдіть на вкладку “Applications”, а потім натисніть кнопку “View” навпроти “Recipe Search API”.
- Скопіюйте “Application ID” та “Application keys” і збережіть їх, щоб використовувати у своєму застосунку.
Створення функціоналу для отримання 5 найкращих рецептів
Повний вихідний код для створення програми пошуку рецептів за допомогою Python можна знайти в репозиторії GitHub.
Імпортуйте необхідні модулі. Створіть функцію `get_top_5_recipes()`, яка отримує назву страви, яку шукає користувач, а потім повертає 5 найкращих рецептів з їхніми назвами, зображеннями та посиланнями. Скористайтеся методом `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()
Перевірте, чи ключ `hits` присутній у JSON-даних та чи є результати пошуку. Якщо так, переберіть результати та витягніть інформацію про рецепт. Щоб завантажити зображення, відправте GET-запит на URL-адресу зображення з параметром `stream=True`. Використайте клас `Image` з модуля Pillow для відкриття зображення. Змініть його розмір до 200×200 пікселів, використовуючи метод передискретизації Lanczos для кращої якості. Перетворіть зображення на формат `PhotoImage`, сумісний з Tkinter, щоб відобразити його в графічному інтерфейсі.
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”, щоб зробити його інтерактивним. Зв’яжіть подію клацання лівою кнопкою миші з функцією `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( "", 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)
Створіть полотно з білим фоном для відображення віджетів з інформацією про рецепти. Розмістіть його з лівого боку вікна, заповнюючи весь простір та розширюючи його при зміні розміру. Створіть вертикальну смугу прокрутки для полотна та розмістіть її з правого боку. Зв’яжіть метод `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( "", lambda event: canvas.configure(scrollregion=canvas.bbox("all")) )
Визначте списки для рецептів, міток, зображень та посилань. Функція `mainloop()` запускає цикл подій Tkinter і прослуховує події, доки ви не закриєте вікно.
recipe_list = [] recipe_labels = [] recipe_images = [] recipe_links = [] root.mainloop()
Зберіть все разом і відкривайте світ кулінарії одним натисканням кнопки.
Результат роботи програми пошуку рецептів
Після запуску програми та введення назви страви, наприклад, “Chicken Burger”, ви отримаєте п’ять найкращих результатів. Кожен результат містить назву рецепту, зображення та посилання. Після натискання на посилання, браузер за замовчуванням відкриє сторінку з повним рецептом. При прокручуванні вмісту, розмір елементів залишається постійним і відображаються різні результати з горизонтальним центруванням.
Покращення програми “Пошук рецептів”
Щоб зробити програму більш функціональною, ви можете додати можливості фільтрації та сортування за різними параметрами, такими як дієтичні вподобання, час приготування, кухня та інші. Також можна розробити функцію додавання улюблених рецептів у закладки для подальшого перегляду та можливість ділитися рецептами в соціальних мережах. Можна створити розділ із рецептами, які найчастіше шукають, додають у закладки тощо.
Поєднуючи свої навички програмування з потужними можливостями API, ви можете перетворити цю базову програму на повноцінний інструмент для пошуку рецептів.