Achar a receita perfeita na vasta extensão da internet, com seus inúmeros links e anúncios, pode ser um verdadeiro desafio. A criação de um aplicativo que funcione como um localizador de receitas oferece uma experiência mais personalizada e agradável, além de um design consistente, eliminando resultados irrelevantes e distrações.
Ao desenvolver este aplicativo, você aprimorará suas habilidades em requisições HTTP, no gerenciamento de chaves de API, na manipulação de imagens e na criação de interfaces gráficas para o usuário, incluindo a atualização dinâmica da GUI.
Instale os Módulos Tkinter, Requests, Pillow e Webbrowser
Para construir um localizador de receitas, você precisará dos módulos Tkinter, Requests, PIL e Webbrowser. O Tkinter permite que você crie aplicativos para desktop, oferecendo uma variedade de widgets que facilitam o desenvolvimento de GUIs. Para instalar o Tkinter, abra seu terminal e execute:
pip install tkinter
O módulo Requests simplifica a criação de requisições HTTP e retorna um objeto de resposta contendo informações como codificação e status. Ele pode ser usado para buscar informações de identificação de chamadas, criar um verificador de status de sites, um conversor de moedas ou um aplicativo de notícias. Para instalar o módulo Requests, abra o terminal e execute:
pip install requests
A biblioteca Pillow, uma ramificação da Python Imaging Library (PIL), oferece recursos para o processamento de imagens, ajudando na edição, criação, conversão de formatos de arquivo e salvamento de imagens. Para instalar o módulo Pillow, abra o terminal e execute:
pip install Pillow
O módulo Webbrowser permite abrir qualquer link no seu navegador padrão e já faz parte da biblioteca padrão do Python, não necessitando de instalação externa.
Gere uma Chave de API do Edamam para Busca de Receitas
Para gerar uma chave de API do Edamam para busca de receitas, siga os seguintes passos:


Construindo a Funcionalidade para Obter as 5 Melhores Receitas
O código-fonte completo para criar um localizador de receitas usando Python está disponível neste Repositório GitHub.
Importe os módulos necessários e crie um método `get_top_5_recipes()` para extrair os títulos, imagens e links das cinco melhores receitas para o prato que o usuário pesquisar. Use `get()` para extrair o nome do prato pesquisado pelo usuário.
Se o usuário inseriu um nome de receita, defina a URL base para o endpoint de pesquisa de receitas da API do Edamam. Passe o `app_id` e o `app_key` que você copiou para autenticar e autorizar as requisições da API.
import tkinter as tk
import requests
from PIL import Image, ImageTk
import webbrowserdef get_top_5_recipes():
recipe_name = entry_recipe_name.get()
if recipe_name:
api_url = "https://api.edamam.com/search"
app_id =
app_key =
Crie um dicionário, `params`, contendo os diferentes parâmetros a serem passados como parte da requisição à API. Defina os pares chave-valor para `q`, `app_id` e `app_key` com os valores obtidos anteriormente e os parâmetros `from` e `to` para refletir o número de resultados que deseja ver.
Envie uma requisição GET para a API do Edamam, combinando a URL da API e o dicionário de parâmetros. Armazene a resposta e extraia-a no formato JSON. Chame `clear_recipe_list()` para limpar as receitas que estão na tela de pesquisas 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 chave `hits` está presente nos dados JSON extraídos e se contém resultados da pesquisa. Se sim, itere sobre os resultados e extraia as informações da receita uma a uma. Envie uma requisição GET para a URL da imagem com o parâmetro `stream` definido como `True` para permitir o streaming de dados da imagem.
Use a classe `Image` do módulo Pillow para abrir a imagem recebida. Redimensione-a para uma altura e largura de 200 pixels, usando o método de reamostragem Lanczos para um redimensionamento de alta qualidade. Converta-a para o formato `PhotoImage` compatível com Tkinter para exibição na interface gráfica.
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
Crie três rótulos para exibir o título da receita, a imagem e o link. Defina a janela principal onde você quer colocá-los, o texto que eles exibirão e o estilo da fonte. Para exibir a imagem, defina o atributo `image` como `photo_image`. Defina a opção de cursor do rótulo do link como `hand2` para torná-lo clicável.
Vincule o link e o evento de clique esquerdo do mouse para chamar a função `open_link()`. Organize todos os widgets usando o método `pack`, centralizando-os horizontalmente e adicionando preenchimento conforme necessário. Anexe o título, as imagens e os links a três listas diferentes.
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)
Crie um método `clear_recipe_list()` para limpar todo o conteúdo da tela gerado pela requisição anterior. Limpe o conteúdo da lista de receitas e itere sobre cada rótulo na lista `recipe_labels`.
Chame o método `pack_forget()` para remover o rótulo da exibição, mas manter o objeto do widget intacto. Limpe a lista `recipe_labels` para novos dados. Repita este processo para as imagens e os links também. Crie um método `open_link()` para abrir o link da receita no seu navegador padrão.
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)
Inicialize a janela raiz do Tkinter. Defina o título, as dimensões e a cor de fundo do aplicativo. Crie um widget de quadro e defina seu elemento pai junto com sua cor de fundo. Crie um rótulo, uma entrada e um botão de pesquisa. Organize todos os widgets usando o método `pack` e adicione preenchimento conforme 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)
Crie uma tela com fundo branco para exibir os widgets contendo as informações da receita. Organize-a no lado esquerdo da janela, ocupando todo o espaço do quadro em ambas as direções e expandindo-o no redimensionamento.
Crie uma barra de rolagem vertical para a tela e coloque-a no lado direito. Vincule o método `scrollbar.set` ao método `canvas.yview` para que a rolagem da barra de rolagem movimente o conteúdo da tela.
Crie um quadro dentro da tela para atuar como um recipiente para os itens da receita, ancorando no canto superior esquerdo da janela. Vincule o evento `
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"))
)
Defina as listas de receitas, rótulos, imagens e links. A função `mainloop()` indica ao Python para executar o loop de eventos do Tkinter e ficar escutando eventos até que a janela seja fechada.
recipe_list = []
recipe_labels = []
recipe_images = []
recipe_links = []root.mainloop()
Junte tudo e explore a culinária com um simples clique.
O Resultado do Aplicativo Localizador de Receitas
Ao executar o programa e inserir um prato, como “Hambúrguer de Frango”, você obterá os cinco primeiros resultados, incluindo o título, a imagem e o link da receita. Ao clicar no link, o navegador padrão abrirá a página da receita. Ao rolar a página, o tamanho do conteúdo se mantém e exibe os resultados centralizados horizontalmente.
Aprimorando o Aplicativo Localizador de Receitas
Para aprimorar o seu aplicativo localizador de receitas, você pode implementar filtros e classificações de acordo com diferentes preferências. Você pode filtrar um prato com base em preferências alimentares, tempo de preparo e culinária, e também classificá-los em qualquer ordem.
Crie um recurso para marcar suas receitas favoritas para visualização posterior, e uma opção para compartilhá-las nas redes sociais. Também é possível criar uma categoria para descobrir os pratos mais pesquisados, mais marcados e assim por diante.
Ao combinar suas habilidades de programação e os poderosos recursos das APIs, você pode transformar este aplicativo básico em uma ferramenta completa.