Как да създадете приложение за търсене на рецепти с помощта на Python

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

.Като създадете това приложение, вие ще изострите уменията си в HTTP заявки, управление на API ключове, манипулиране на изображения и изграждане на графични потребителски интерфейси, включително динамично актуализиране на GUI.

Инсталирайте модула Tkinter, Requests, Pillow и Webbrowser

За да създадете приложение за намиране на рецепти, имате нужда от Tkinter, Requests, PIL и модула Webbrowser. Tkinter ви позволява да създавате настолни приложения. Той предлага разнообразие от джаджи, които улесняват разработването на GUI. За да инсталирате Tkinter, отворете терминала и стартирайте:

 pip install tkinter 

Модулът Requests улеснява отправянето на HTTP заявки и връщането на обект за отговор, който съдържа данни като кодиране и състояние. Можете да го използвате, за да извлечете информация за идентификация на обаждащия се, да създадете програма за проверка на състоянието на уебсайта, валутен конвертор или приложение за новини. За да инсталирате модула Заявки, отворете терминала и стартирайте:

 pip install requests 

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

 pip install Pillow 

Модулът Webbrowser ви помага да отворите всяка връзка в браузъра си по подразбиране. Той е част от стандартната библиотека на Python. Следователно не е необходимо да го инсталирате външно.

За да генерирате API ключа за търсене на рецепти Edamam, изпълнете следните стъпки:

  • Посетете Едамам и щракнете върху бутона API за регистрация. Попълнете подробностите и изберете своя план като API за търсене на рецепти – Разработчик.
  • Влезте в акаунта си, щракнете върху бутона Акаунти и след това щракнете върху бутона Отидете до таблото за управление.
  • След това щракнете върху раздела Приложения и накрая щракнете върху бутона Преглед до API за търсене на рецепти.
  • Копирайте ИД на приложението и ключовете на приложението и ги запазете, за да ги използвате във вашето приложение.
  •   Проследявайте проблеми, подобрявайте сътрудничеството и постигайте резултати

    Изграждане на функционалността за получаване на Топ 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 =

    Създайте речник, параметри, който съдържа различните параметри, които трябва да подадете като част от заявката за API. Задайте двойките ключ-стойност за q, app_id и app_key на стойностите, които сте получили по-рано. Задайте параметрите от и до, за да отразите броя на резултатите, които искате да видите.

    Изпратете 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)

    Изграждане на структурата на приложението

    Дефинирайте три етикета за показване на заглавието на рецептата, изображението и връзката към рецептата. Задайте родителския прозорец, в който искате да го поставите, текста, който искате да се показва, и стила на шрифта, който трябва да има. За да покажете изображението, задайте атрибута на изображението на photo_image. Задайте опцията на курсора в етикета на връзката на hand2, за да може да се кликва върху нея.

      Как да изтриете думи с акаунт на приятели

    Свържете връзката и събитието с щракване с левия бутон на мишката, за да извикате функцията open_link(). Организирайте всички джаджи с помощта на метода на пакетиране, центрирайте ги хоризонтално и добавете подложка, ако е необходимо. Добавете заглавието, изображенията и връзките към три различни списъка.

                     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. Задайте заглавието, размерите и цвета на фона на приложението. Дефинирайте widget с рамка и задайте неговия родителски елемент заедно с цвета на фона му. Създайте етикет, запис и бутон за търсене. Организирайте всички уиджети, като използвате метода за пакетиране и добавете подложка, ако е необходимо.

     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(
       "<Configure>", lambda event: canvas.configure(scrollregion=canvas.bbox("all"))
    )

    Дефинирайте списъка за рецепти, етикети, изображения и връзки. Функцията mainloop() казва на Python да стартира цикъла на събитията на Tkinter и да слуша за събития, докато затворите прозореца.

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

    root.mainloop()

    Съберете всичко заедно и открийте кухни с едно натискане на бутон.

    Резултатът от приложението за търсене на рецепти

    При стартиране на програмата и въвеждане на ястието като пилешки бургер получавате първите пет резултата. Той съдържа заглавието, изображението и връзката към рецептата на ястието, което сте въвели. При щракване върху връзката уеб браузърът по подразбиране отваря връзката към рецептата. При превъртане надолу размерът на съдържанието остава същият и показва различните резултати, центрирани хоризонтално.

    Подобряване на приложението за търсене на рецепти

    За да подобрите вашето приложение за търсене на рецепти, можете да приложите филтриране и сортиране според различни предпочитания. Можете да филтрирате ястие според хранителните предпочитания, времето за готвене и кухнята и да ги сортирате в произволен ред.

    Създайте функция за отбелязване на любимите си рецепти, за да ги видите по-късно, и опция за споделянето им в социалните медии. Можете да създадете категория, за да откриете най-търсените ястия, най-маркираните и т.н.

    Комбинирайки уменията си за програмиране и мощните функции на API, можете допълнително да конвертирате това основно приложение в пълноценно.