Contents

Como construir um aplicativo localizador de receitas usando Python

Encontrar uma receita ideal em meio à vasta gama de recursos online disponíveis pode ser uma tarefa assustadora devido ao grande número de opções e anúncios intrusivos. O desenvolvimento de um aplicativo personalizado de descoberta de receitas oferece uma interface simplificada e intuitiva que filtra informações e distúrbios não relacionados, simplificando assim o processo de localização de conteúdo culinário adequado para os usuários.

Através do desenvolvimento deste software, a pessoa aprimorará sua proficiência em fazer demandas HTTP, gerenciar chaves de API, alteração de imagem, bem como criar interfaces de usuário interativas com recursos como atualizações em tempo real.

Instale o módulo Tkinter, Requests, Pillow e Webbrowser

Para construir um aplicativo para localizar receitas, são necessários Tkinter, Requests, PIL e o módulo Webbrowser. O primeiro permite a criação de interfaces gráficas de usuário em desktops por meio do fornecimento de diversos widgets que facilitam o desenvolvimento da GUI. Para obter o Tkinter, pode-se navegar até o terminal e executar o comando:

 pip install tkinter 

A biblioteca Requests facilita o processo de fazer solicitações HTTP, fornecendo uma interface fácil de usar para recuperar dados de várias fontes, incluindo informações de identificação de chamadas, verificações de status do site e conversões de moeda. Essa ferramenta versátil pode ser empregada em uma ampla gama de aplicações, como a criação de um agregador de notícias. Para integrar o módulo Requests ao seu projeto, basta navegar até o terminal e executar o comando:

 pip install requests 

A biblioteca Pillow, derivada da Python Imaging Library (PIL), oferece funcionalidades robustas para manipulação de imagens, abrangendo tarefas como edição, geração, conversão de formato e armazenamento. Para integrar este módulo ao seu projeto, inicie o processo de instalação abrindo uma interface de linha de comando e executando os comandos necessários.

 pip install Pillow 

O módulo Webbrowser, que forma um componente da abrangente biblioteca padrão Python, permite que o usuário acesse qualquer URL desejado em seu navegador preferido sem a necessidade de instalação externa.

Gerar chave de API do Edamam para pesquisa de receitas

Para obter uma chave da API Edamam Recipe Search, siga o processo subsequente:

⭐ Visite Edamam e clique no botão Signup API. Preencha os detalhes e escolha seu plano como Recipe Search API-Developer. /pt/images/edamam-api-website.jpg

⭐ Faça login na sua conta, clique no botão Contas e, em seguida, clique no botão Ir para o painel. /pt/images/edamam-dashboard-button.jpg

⭐ Após isso, clique na aba Applications e por fim clique no botão View ao lado de Recipe Search API. /pt/images/application-tab-of-edamam-dashboard.jpg

Copie o ID do aplicativo fornecido, juntamente com suas chaves de aplicativo correspondentes, para referência futura e incorporação no processo de desenvolvimento de seu aplicativo.

Construindo a funcionalidade para obter as 5 principais receitas

O código-fonte completo necessário para desenvolver um mecanismo de pesquisa de receitas utilizando Python está disponível neste repositório específico do GitHub, que serve como uma plataforma online para os desenvolvedores colaborarem e compartilharem seus trabalhos com outras pessoas.

Claro! Aqui está um exemplo de implementação em Python usando a estrutura Flask e a biblioteca Elasticsearch para pesquisar a receita com base nos ingredientes:pythonfrom flask import Flask, requestimport requestsfrom elasticsearch import Elasticsearchapp=Flask( name )es=Elasticsearch([{‘host’:’localhost’,‘port’: 9200}])@app.route(’/’)def search():query=request.args.get(‘query’)if not query:return “Please enter a search query.”, 400# Pesquise receitas que contenham o(s) ingrediente(s) fornecido(s)response=es.search(index=‘my_index’, body={‘query’: {‘multi

Se o usuário forneceu um nome de receita, determine a URL base para a funcionalidade de pesquisa de receita da API do Edamam incorporando o ID do aplicativo obtido anteriormente e a chave para fins de autenticação e autorização.

 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 = # Put your app id for edamam api
        app_key = # Put your app key for edamam api

Para criar um dicionário contendo vários parâmetros necessários em uma solicitação de API, devemos primeiro definir os pares chave-valor para três chaves essenciais-q , app\_id e app\_key. A estes devem ser atribuídos os respectivos valores obtidos anteriormente. Além disso, é importante definir o parâmetro de para representar a quantidade desejada de resultados de pesquisa enquanto ajusta o parâmetro para de acordo.

Para recuperar dados da API do Edamam, uma solicitação GET deve ser enviada com o endpoint da API e quaisquer parâmetros necessários incluídos como parte da URL, juntamente com o dicionário de parâmetros. A resposta resultante deve ser analisada e extraída no formato JSON para processamento posterior. Além disso, é importante chamar a função “clear\_recipe\_list()” para remover quaisquer receitas exibidas anteriormente de chamadas de API anteriores.

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

Verifique se a palavra-chave especificada aparece no conteúdo JSON recuperado e garante que ela englobe o resultado da pesquisa desejado. Em caso de confirmação positiva, percorra cada item na lista de resultados da pesquisa e isole os detalhes da receita correspondente. Posteriormente, envie uma solicitação GET HTTP para a respectiva URL da imagem enquanto configura o atributo “stream” como true, permitindo assim a transmissão em tempo real de dados visuais.

Utilize a funcionalidade fornecida pela classe Image da biblioteca Pillow para acessar a imagem digital que foi transmitida. Otimize a resolução do conteúdo visual empregando a técnica avançada de reamostragem de Lanczos, conhecida por produzir resultados excepcionais em operações de dimensionamento de imagem. Posteriormente, transforme a imagem aprimorada em um formato compatível com o objeto PhotoImage do Tkinter, permitindo uma integração perfeita na interface gráfica do usuário.

         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) 

Construindo a Estrutura do Aplicativo

Para exibir o título de uma receita, uma imagem que a acompanha e fornecer um hiperlink para a receita correspondente em uma janela pai especificada, utilize o seguinte trecho de código que define três rótulos com atributos específicos para cada elemento. O primeiro rótulo exibe o título da receita usando o texto fornecido, enquanto o segundo rótulo exibe a imagem usando o atributo photo\_image e permite clicar no hiperlink definindo a propriedade cursor do terceiro rótulo como hand2.

Para estabelecer uma conexão entre o hiperlink e o evento de clique com o botão esquerdo, é essencial invocar a função open\_link(). Para realizar esta tarefa, utilizamos o método pack() para organizar os vários widgets enquanto garantimos que eles estejam alinhados centralmente ao longo do eixo horizontal com preenchimento apropriado. Também é importante criar listas separadas para armazenar os títulos, imagens e links para que possam ser facilmente acessados ​​quando necessário.

                 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) 

Para erradicar todos os elementos visuais produzidos como resultado de solicitações anteriores, introduza uma nova função chamada clear\_recipe\_list(). Esta operação removerá todos os vestígios de dados contidos na lista de receitas enquanto itera através de cada entrada na coleção receita\_labels.

O ato de utilizar a função “pack\_forget()” para separar o rótulo exibido enquanto preserva a estrutura subjacente do widget é referido como remover o rótulo da apresentação visual, mas mantendo sua existência funcional dentro do programa.

Para garantir que todos os dados associados às receitas estejam atualizados, é necessário limpar todas as informações existentes relacionadas aos rótulos das receitas. Isso inclui não apenas o texto dos próprios rótulos, mas também quaisquer imagens ou hiperlinks que os acompanham. Para facilitar esse processo, podemos definir uma função chamada “open\_link()” que lançará o link da receita correspondente no navegador da Web preferido do usuário.

 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) 

Inicie a janela principal do Tkinter especificando o nome do programa e criando um widget de nível superior. Determine as dimensões da janela e adote uma resolução preferida para uma qualidade de exibição ideal. Estabeleça uma cor sólida ou gradiente como tema de fundo para aumentar o apelo visual. Construa um elemento de quadro que sirva como um contêiner para outros componentes dentro da interface. Especifique o parentesco do quadro ao definir sua largura, altura e sombra de fundo. Projete um rótulo, um campo de entrada e um botão de pesquisa, cada um seguindo as práticas recomendadas nos princípios de design da GUI. Utilize o gerenciador de layout pack para organizar esses elementos de forma eficiente, aplicando o espaçamento adequado quando necessário.

 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) 

“Instrua o computador a gerar uma tela em branco com um pano de fundo branco imaculado, que servirá como um espaço de exibição para vários widgets que contêm ingredientes e instruções referentes a pratos cozidos. Posicione esta vitrine visual ao longo da borda esquerda da tela, permitindo que ela ocupe toda a largura de sua área alocada, ao mesmo tempo em que alonga suas dimensões quando a janela é redimensionada.

Para criar uma barra de rolagem vertical para a tela, devemos primeiro chamar o método scrollbars() do widget pai (neste caso, a janela principal) para habilitá-los caso estejam desabilitados por padrão. Então, podemos usar a função create\_window do módulo tkinter para criar um novo objeto de barra de rolagem com as propriedades desejadas, como tamanho, comando, etc. que quando é clicado ou arrastado, chama o método correspondente na classe controladora da barra de rolagem. Finalmente, podemos vincular o movimento da barra de rolagem à tela usando os métodos xview e yview do widget da tela.

Para estabelecer um limite adequado dentro do ambiente de tela para acomodar os componentes da receita e afixá-los com segurança no canto superior esquerdo da tela, aproveite a ocasião e ajuste-o adequadamente para garantir que o invólucro envolvente seja capaz de rolar adequadamente quando seu conteúdo sofre alteração ou redimensionamento.

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

um repositório de receitas, rótulos para identificar itens ou categorias específicas, representações visuais na forma de imagens e hiperlinks que conectam informações relevantes. Ao implementar esses recursos principais, os usuários podem navegar pelo aplicativo com facilidade enquanto se beneficiam de uma apresentação organizada de dados. A função mainloop() serve como a base desse projeto, instruindo o interpretador Python a ativar o loop de eventos Tkinter. Isso permite que o programa monitore continuamente os eventos recebidos e responda adequadamente até o momento em que o usuário opte por fechar a interface gráfica. Por meio desse processo iterativo, nosso aplicativo permanece responsivo e adaptável à entrada do usuário, criando uma experiência contínua em cada interação.

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

root.mainloop() 

Experimente uma ampla variedade de delícias culinárias com apenas um simples clique do mouse, pois reunimos várias cozinhas de todo o mundo para sua conveniência.

A saída do aplicativo Recipe Finder

Ao executar o aplicativo de software e digitar “Chicken Burger” como entrada, uma lista dos cinco principais resultados de pesquisa será exibida. Esta compilação inclui o título, uma fotografia que o acompanha e um hiperlink para a página da receita correspondente. Ao selecionar o URL fornecido, seu navegador de Internet preferido abrirá automaticamente a página da Web especificada. À medida que você percorre o conteúdo, as dimensões permanecem constantes enquanto apresentam vários resultados de pesquisa simetricamente alinhados no centro da tela.

/pt/images/recipe-finder-when-chicken-burger-is-searched-2.jpg

Aprimorando o aplicativo localizador de receitas

Para refinar a funcionalidade do nosso software de localização de receitas, incorporamos várias opções para filtrar e organizar os resultados da pesquisa com base em gostos e requisitos individuais. Os usuários podem optar por restringir sua pesquisa especificando critérios como restrições alimentares, tempo de preparação e antecedentes culturais, além de ter a flexibilidade de organizar os resultados em qualquer sequência desejada.

Apresente um recurso personalizado que permite aos usuários salvar suas receitas preferidas para referência futura, ao mesmo tempo em que oferece a oportunidade de compartilhar essas seleções com amigos e familiares por meio de várias plataformas de redes sociais. Além disso, considere a implementação de um sistema de categorização que destaque pratos popularmente pesquisados ​​ou salvos com frequência, permitindo que os usuários explorem novas opções culinárias com base nas preferências coletivas da comunidade.

Ao alavancar sua proficiência em programação e utilizar os recursos robustos das interfaces de programação de aplicativos (APIs), você tem o potencial de transformar esse aplicativo rudimentar em uma solução abrangente e avançada.