Како да направите апликацију за проналажење рецепата користећи Питхон

U moru recepata rasutih po internetu, gde se prepliću stotine linkova i reklama, pronalazak idealnog recepta može biti pravi izazov. Razvoj aplikacije za pretragu recepata pruža vam personalizovano i intuitivno korisničko iskustvo, uz dosledan dizajn, eliminišući nepotrebne rezultate i ometanja.

Kroz izradu ove aplikacije, imaćete priliku da unapredite svoje veštine u radu sa HTTP zahtevima, upravljanju API ključevima, obradi slika i kreiranju grafičkih korisničkih interfejsa, uključujući dinamičko ažuriranje GUI-a.

Instalacija Tkinter, Requests, Pillow i Webbrowser modula

Za razvoj aplikacije za pretragu recepata neophodni su vam Tkinter, Requests, PIL (Pillow) i Webbrowser moduli. Tkinter vam omogućava izradu desktop aplikacija i nudi raznovrsne widgete koji olakšavaju razvoj GUI-a. Da biste instalirali Tkinter, otvorite terminal i pokrenite sledeću komandu:

 pip install tkinter 

Modul Requests olakšava kreiranje HTTP zahteva i vraća odgovor objekat koji sadrži podatke kao što su kodiranje i status. Možete ga koristiti za preuzimanje informacija o ID-u pozivaoca, kreiranje provere statusa veb stranica, konverter valuta ili aplikaciju za vesti. Za instaliranje Requests modula, otvorite terminal i pokrenite:

 pip install requests 

Pillow biblioteka, izvedena iz Python Imaging Library (PIL), pruža funkcije za obradu slika, korisne za uređivanje, kreiranje, konvertovanje formata datoteka i čuvanje slika. Za instalaciju Pillow modula, koristite sledeću komandu u terminalu:

 pip install Pillow 

Webbrowser modul vam omogućava da otvorite bilo koji link u vašem podrazumevanom pretraživaču. Ovaj modul je deo standardne Python biblioteke, tako da nije potrebna dodatna instalacija.

Generisanje Edamam API ključa za pretragu recepata

Da biste generisali Edamam API ključ, sledite ove korake:

  • Posetite Edamam i kliknite na dugme „API sign up“. Popunite potrebne podatke i izaberite „Recipe Search API – Developer“ plan.
  • Prijavite se na svoj nalog, kliknite na „Accounts“, a zatim na „Go to Dashboard“.
  • Nakon toga, kliknite na karticu „Applications“, a zatim na dugme „View“ pored Recipe Search API.
  • Kopirajte „Application ID“ i „Application keys“ i sačuvajte ih za upotrebu u vašoj aplikaciji.
  • Izgradnja funkcionalnosti za dobijanje 5 najboljih recepata

    Kompletan izvorni kod za kreiranje aplikacije za pretragu recepata pomoću Pythona možete pronaći na GitHub repozitorijumu.

    Uvezite potrebne module. Definišite metodu `get_top_5_recipes()` koja preuzima naslove, slike i linkove pet najboljih recepata koje korisnik traži. Koristite `get()` da biste izdvojili naziv jela koji je korisnik uneo.

    Ako je korisnik uneo naziv recepta, definišite osnovni URL za krajnju tačku pretrage recepata Edamam API-ja. Prosledite `app_id` i `app_key` koje ste prethodno kopirali da biste potvrdili autentičnost i autorizovali API zahteve.

     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 =

    Napravite rečnik parametara koji sadrži različite parametre koje treba proslediti kao deo API zahteva. Postavite parove ključ/vrednost za `q`, `app_id` i `app_key` na vrednosti koje ste ranije dobili. Podesite parametre `from` i `to` da odražavaju broj rezultata koje želite da vidite.

    Pošaljite GET zahtev Edamam API-ju kombinujući API URL i rečnik parametara. Sačuvajte odgovor i izdvojite ga u JSON formatu. Pozovite `clear_recipe_list()` da obrišete recepte prisutne na ekranu iz prethodnih zahteva.

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

    Proverite da li je ključ „hits“ prisutan u izdvojenim JSON podacima i da li sadrži rezultate pretrage. Ako jeste, iterirajte rezultate pretrage i izdvojte informacije o receptu jednu po jednu. Pošaljite GET zahtev na URL slike sa parametrom `stream` postavljenim na `True` kako biste omogućili strimovanje podataka slike.

    Koristite klasu `Image` modula Pillow da otvorite sliku koju ste primili. Promenite veličinu slike tako da ima visinu i širinu od 200 piksela koristeći Lanczos metod ponovnog uzorkovanja za visokokvalitetnu promenu veličine. Pretvotite ovo u Tkinter kompatibilnu `PhotoImage` da biste je prikazali na grafičkom korisničkom interfejsu.

         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)

    Izgradnja strukture aplikacije

    Definišite tri oznake (label) za prikaz naslova recepta, slike i linka do recepta. Podesite roditeljski prozor (parent widget) u koji želite da ih postavite, tekst koji želite da prikažete i stil fonta koji treba da imaju. Da biste prikazali sliku, postavite atribut slike na `photo_image`. Postavite opciju kursora u oznaci linka na `hand2` da bi se moglo kliknuti na nju.

    Povežite link i događaj levim klikom miša da biste pozvali funkciju `open_link()`. Organizujte sve widgete koristeći metod `pack()`, centrirajte ih horizontalno i dodajte margine po potrebi. Dodajte naslov, slike i linkove na tri različite liste.

             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)

    Definišite metodu `clear_recipe_list()` da obrišete ceo sadržaj ekrana generisan prethodnim zahtevom. Obrišite sadržaj liste recepata i pređite preko svake oznake na listi `recipe_labels`.

    Pozivanje metode `pack_forget()` ukloniće oznaku sa ekrana, ali će objekat widgeta ostati nepromenjen.

    Obrišite listu `recipe_labels` za nove podatke. Ponovite ovaj postupak i za slike i linkove. Definišite metodu `open_link()` da otvorite link za recept u vašem podrazumevanom veb pretraživaču.

     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)

    Inicijalizujte Tkinter root prozor. Podesite naslov, dimenzije i boju pozadine aplikacije. Definišite widget okvira i postavite njegov roditeljski element zajedno sa bojom pozadine. Kreirajte oznaku, unos i dugme za pretragu. Organizujte sve widgete koristeći metod `pack()` i dodajte margine po potrebi.

     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)

    Napravite platno (canvas) sa belom pozadinom da biste prikazali widgete koji sadrže informacije o receptu. Organizujte ga na levoj strani prozora, zauzimajući sav prostor u okviru u oba smera i proširujući ga pri promeni veličine.

    Napravite vertikalnu traku za pomeranje (scrollbar) za platno i postavite je na desnu stranu. Povežite metodu `scrollbar.set` sa metodom `canvas.yview` tako da će pomeranje trake za pomeranje pomerati sadržaj platna.

    Napravite okvir unutar platna koji će služiti kao kontejner za stavke recepta, pričvršćujući se u gornjem levom uglu prozora. Povežite događaj `` tako da osigurate da se okvir može pravilno pomerati kada se njegov sadržaj promeni ili promeni veličinu.

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

    Definišite liste za recepte, oznake, slike i linkove. Funkcija `mainloop()` govori Python-u da pokrene Tkinter petlju događaja i osluškuje događaje dok ne zatvorite prozor.

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

    root.mainloop()

    Spojite sve to i otkrijte svetske kuhinje jednim klikom.

    Izgled aplikacije za pretragu recepata

    Kada pokrenete program i unesete jelo kao što je „Chicken Burger“, dobićete prvih pet rezultata. Oni sadrže naslov, sliku i link za recept jela koje ste uneli. Kada kliknete na link, podrazumevani veb pretraživač otvara link do recepta. Prilikom pomeranja nadole, veličina sadržaja ostaje ista i prikazuje različite rezultate centrirane horizontalno.

    Poboljšanje aplikacije za pretragu recepata

    Da biste poboljšali svoju aplikaciju, možete implementirati filtere i sortiranje po različitim preferencijama. Možete filtrirati jelo prema preferencijama u ishrani, vremenu kuvanja i kuhinji, i sortirati ih po željenom redosledu.

    Kreirajte funkciju za obeležavanje omiljenih recepata za kasniju upotrebu i opciju za deljenje na društvenim mrežama. Možete da napravite kategoriju za otkrivanje najtraženijih jela, najčešće obeleženih i slično.

    Kombinujući svoje programerske veštine i moćne karakteristike API-ja, možete dalje da konvertujete ovu osnovnu aplikaciju u funkcionalnu i sveobuhvatnu.