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.
⭐ Faça login na sua conta, clique no botão Contas e, em seguida, clique no botão Ir para o painel.
⭐ Após isso, clique na aba Applications e por fim clique no botão View ao lado de Recipe Search API.
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.
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.