Med overfloden af opskrifter spredt over hele internettet med hundredvis af links og annoncer, kan det være en udfordring at finde den perfekte opskrift. Opbygning af en opskriftsfinder-app giver dig en skræddersyet og brugervenlig oplevelse og ensartet design, der eliminerer alle irrelevante resultater og distraktioner
.Ved at bygge denne applikation skærper du dine færdigheder inden for HTTP-anmodninger, API-nøglehåndtering, billedmanipulation og opbygning af grafiske brugergrænseflader, inklusive dynamisk GUI-opdatering.
Indholdsfortegnelse
Installer modulet Tkinter, Requests, Pillow og Webbrowser
For at bygge en opskriftssøgningsapplikation kræver du Tkinter, Requests, PIL og webbrowsermodulet. Tkinter giver dig mulighed for at oprette desktop-applikationer. Det tilbyder en række widgets, der gør det nemmere at udvikle GUI’er. For at installere Tkinter skal du åbne terminalen og køre:
pip install tkinter
Requests-modulet gør det nemt at lave HTTP-anmodninger og returnere et svarobjekt, der indeholder data såsom kodning og status. Du kan bruge den til at hente opkalds-id-oplysninger, oprette en hjemmesidestatuskontrol, valutaomregner eller en nyhedsapplikation. For at installere Requests-modulet skal du åbne terminalen og køre:
pip install requests
Pillow-biblioteket – en forgrening af Python Imaging Library (PIL) – giver billedbehandlingsfunktioner, der hjælper med at redigere, oprette, konvertere filformater og gemme billeder. For at installere pudemodulet skal du åbne terminalen og køre:
pip install Pillow
Webbrowsermodulet hjælper dig med at åbne ethvert link i din standardbrowser. Det er en del af Python-standardbiblioteket. Derfor behøver du ikke installere den eksternt.
Generer Edamam API-nøgle til opskriftssøgning
For at generere Edamam Recipe Search API-nøglen skal du følge følgende trin:


Opbygning af funktionaliteten for at få de 5 bedste opskrifter
Du kan finde hele kildekoden til at bygge et opskriftsfinderprogram ved hjælp af Python i denne GitHub-depot.
Importer de nødvendige moduler. Definer en metode get_top_5_recipes(), der henter de fem bedste opskrifters titler, billeder og links til den ret, brugeren søger efter. Brug get() til at udtrække navnet på den ret, brugeren søgte efter.
Hvis brugeren indtastede et opskriftsnavn, skal du definere basis-URL’en for Edamam API’s opskriftssøgningsslutpunkt. Send app_id og app_key, du kopierede tidligere, for at godkende og godkende API-anmodninger.
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 =
Opret en ordbog, parametre, der indeholder de forskellige parametre, du skal videregive som en del af API-anmodningen. Indstil nøgleværdi-parrene for q, app_id og app_key til de værdier, du fik tidligere. Indstil fra og til parametrene for at afspejle antallet af resultater, du vil se.
Send en GET-anmodning til Edamam API’et ved at kombinere API-URL’en og params-ordbogen. Gem svaret og udpak det i JSON-format. Kald clear_recipe_list() for at fjerne opskrifterne på skærmen fra tidligere anmodninger.
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()
Tjek, om nøglehits er til stede i de udpakkede JSON-data, og om det indeholder søgeresultatet. Hvis ja, gentag søgeresultaterne og udtræk opskriftsoplysningerne én efter én. Send en GET-anmodning til billed-URL’en med stream-parameteren sat til True for at tillade streaming af billeddata.
Brug pudemodulets billedklasse til at åbne det billede, du har modtaget. Ændr størrelsen på den, så den får en højde og bredde på 200 pixels ved hjælp af Lanczos resampling-metoden for at ændre størrelsen i høj kvalitet. Konverter dette til Tkinter-kompatibelt PhotoImage for at vise det på den grafiske brugergrænseflade.
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)
Opbygning af applikationens struktur
Definer tre etiketter for at vise opskriftens titel, billedet og linket til opskriften. Indstil det overordnede vindue, du vil placere det i, den tekst, du vil vise, og den skrifttype, den skal have. For at vise billedet skal du indstille billedattributten til photo_image. Indstil markørindstillingen i linketiketten til hånd2 for at gøre den klikbar.
Bind linket og hændelsen med venstre museklik for at kalde funktionen open_link(). Organiser alle widgets ved hjælp af pakkemetoden, centrer dem vandret, og tilføj polstringen efter behov. Føj titlen, billederne og links til tre forskellige lister.
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)
Definer en metode, clear_recipe_list() for at rydde hele skærmens indhold, der er genereret af den tidligere anmodning. Ryd indholdet af opskriftslisten og gentag over hver etiket i opskriftsetikettelisten.
Kalder pack_forget()-metoden for at fjerne etiketten fra displayet, men holde widgetobjektet intakt.
Ryd opskriftsetiketter-listen for nye data. Gentag også denne proces for billederne og linkene. Definer en metode, open_link() for at åbne opskriftslinket i din standard webbrowser.
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)
Initialiser Tkinter-rodvinduet. Indstil applikationens titel, dimensioner og baggrundsfarve. Definer en ramme-widget, og indstil dets overordnede element sammen med dets baggrundsfarve. Opret en etiket, en post og en søgeknap. Organiser alle widgets ved hjælp af pakkemetoden, og tilføj polstring efter behov.
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)
Opret et lærred med en hvid baggrund for at vise de widgets, der indeholder opskriftsoplysninger. Organiser den til venstre i vinduet, tag al pladsen i rammen i begge retninger og udvid den ved ændring af størrelse.
Opret en lodret rullebjælke til lærredet og placer den på dets højre side. Knyt scrollbar.set-metoden til canvas.yview-metoden, så rulning af rullepanelet vil rulle gennem lærredets indhold.
Opret en ramme inde i lærredet, der fungerer som en beholder til opskriftsgenstandene, forankret øverst til venstre i vinduet. Bind
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"))
)
Definer listen for opskrifter, etiketter, billeder og links. Mainloop()-funktionen fortæller Python at køre Tkinter-hændelsesløkken og lytte efter hændelser, indtil du lukker vinduet.
recipe_list = []
recipe_labels = []
recipe_images = []
recipe_links = []root.mainloop()
Sæt det hele sammen, og opdag køkkener med et enkelt klik på en knap.
Outputtet af Recipe Finder-applikationen
Når du kører programmet og går ind i retten som kyllingeburger, får du de fem bedste resultater. Den indeholder titlen, billedet og opskriftslinket for den ret, du indtastede. Når du klikker på linket, åbner standardwebbrowseren opskriftslinket. Når du ruller ned, forbliver indholdsstørrelsen den samme og viser de forskellige resultater centreret vandret.
Forbedring af Recipe Finder-applikationen
For at forbedre din opskriftsfinderapplikation kan du implementere filtrering og sortering efter forskellige præferencer. Du kan filtrere en ret efter diætpræferencer, tilberedningstid og køkken og sortere dem i vilkårlig rækkefølge.
Opret en funktion til at bogmærke dine yndlingsopskrifter for at se dem senere, og en mulighed for at dele dem på sociale medier. Du kan oprette en kategori for at finde de mest søgte retter, de fleste bogmærkede og så videre.
Ved at kombinere dine programmeringsevner og de kraftfulde funktioner i API’er kan du yderligere konvertere denne grundlæggende applikation til en fuldgyldig.