دیگر وقت خود را برای جستجوی اینجا و آنجا برای دستور پخت عالی تلف نکنید. از این راهنما برای ایجاد برنامه سفارشی یاب شخصی خود استفاده کنید.
با فراوانی دستور العمل های پراکنده در سراسر اینترنت با صدها پیوند و تبلیغات، یافتن دستور غذای کامل می تواند چالش برانگیز باشد. ساختن یک برنامه یاب دستور غذا، تجربهای متناسب و کاربرپسند، و طراحی ثابت را در اختیار شما قرار میدهد و تمام نتایج نامربوط و حواسپرتی را حذف میکند.
با ساخت این برنامه، مهارت های خود را در درخواست های HTTP، مدیریت کلید API، دستکاری تصویر، و ایجاد رابط های کاربری گرافیکی از جمله به روز رسانی رابط کاربری گرافیکی پویا تقویت خواهید کرد.
ماژول Tkinter، Requests، Pillow و Webbrowser را نصب کنید
برای ساختن یک برنامه یاب دستور غذا، به Tkinter، Requests، PIL و ماژول Webbrowser نیاز دارید. Tkinter به شما اجازه می دهد تا برنامه های دسکتاپ ایجاد کنید. ویجت های مختلفی را ارائه می دهد که توسعه رابط کاربری گرافیکی را آسان تر می کند. برای نصب Tkinter ترمینال را باز کرده و اجرا کنید:
pip install tkinter
ماژول Requests انجام درخواست های HTTP و برگرداندن یک شی پاسخ که حاوی داده هایی مانند رمزگذاری و وضعیت است را ساده می کند. می توانید از آن برای واکشی اطلاعات شناسه تماس گیرنده، ایجاد یک بررسی کننده وضعیت وب سایت، مبدل ارز یا یک برنامه خبری استفاده کنید. برای نصب ماژول Requests، ترمینال را باز کرده و اجرا کنید:
pip install requests
کتابخانه Pillow – یک شاخه کتابخانه تصویربرداری پایتون (PIL) – قابلیتهای پردازش تصویر را ارائه میکند که به ویرایش، ایجاد، تبدیل فرمتهای فایل و ذخیره تصاویر کمک میکند. برای نصب ماژول Pillow، ترمینال را باز کرده و اجرا کنید:
pip install Pillow
ماژول Webbrowser به شما کمک می کند هر پیوندی را در مرورگر پیش فرض خود باز کنید. این بخشی از کتابخانه استاندارد پایتون است. بنابراین، نیازی به نصب خارجی آن ندارید.
کلید API Edamam را برای جستجوی دستور تهیه کنید
برای ایجاد کلید Edamam Recipe Search API، مراحل زیر را دنبال کنید:
- از Edamam دیدن کنید و روی دکمه Signup API کلیک کنید. جزئیات را پر کنید و طرح خود را به عنوان Recipe Search API – Developer انتخاب کنید.
- وارد حساب کاربری خود شوید، روی دکمه Accounts کلیک کنید و سپس روی دکمه Go to Dashboard کلیک کنید.
- پس از آن، روی تب Applications کلیک کنید و در نهایت روی دکمه View در کنار Recipe Search API کلیک کنید.
- شناسه برنامه و کلیدهای برنامه را کپی کرده و ذخیره کنید تا در برنامه خود استفاده کنید.
ایجاد عملکرد برای دریافت 5 دستور غذای برتر
شما می توانید کل کد منبع برای ساختن یک برنامه دستور یاب با استفاده از پایتون را در این مخزن GitHub پیدا کنید.
ماژول های مورد نیاز را وارد کنید. یک روش get_top_5_recipes() تعریف کنید که عناوین، تصاویر و پیوندهای پنج دستور غذای برتر را از غذای مورد جستجوی کاربر بازیابی می کند. از get() برای استخراج نام ظرفی که کاربر جستجو کرده است استفاده کنید.
اگر کاربر نام دستور غذا را وارد کرده است، URL پایه را برای نقطه پایانی جستجوی دستور العمل Edamam API تعریف کنید. برای احراز هویت و تأیید درخواستهای API، app_id و app_key را که قبلاً کپی کردهاید، ارسال کنید.
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
یک فرهنگ لغت ایجاد کنید، پارامترهایی که حاوی پارامترهای مختلفی است که باید به عنوان بخشی از درخواست API ارسال کنید. جفتهای key-value را برای q، app_id و app_key روی مقادیری که قبلاً دریافت کردهاید، تنظیم کنید. پارامترهای from و to را تنظیم کنید تا تعداد نتایجی را که می خواهید ببینید منعکس شود.
یک درخواست GET با ترکیب URL API و فرهنگ لغت پارامترها به Edamam API ارسال کنید. پاسخ را ذخیره کرده و با فرمت JSON استخراج کنید. برای پاک کردن دستور العمل های موجود روی صفحه از درخواست های قبلی، clear_recipe_list() را فراخوانی کنید.
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()
بررسی کنید که آیا کلید، بازدیدها در دادههای JSON استخراجشده وجود دارد و آیا حاوی نتیجه جستجو است. اگر بله، نتایج جستجو را تکرار کنید و اطلاعات دستور پخت را یکی یکی استخراج کنید. یک درخواست GET به URL تصویر با پارامتر جریان تنظیم شده روی True ارسال کنید تا امکان پخش داده های تصویر فراهم شود.
از کلاس Image ماژول Pillow برای باز کردن تصویری که دریافت کرده اید استفاده کنید. با استفاده از روش نمونه گیری مجدد Lanczos برای تغییر اندازه با کیفیت بالا، اندازه آن را به ارتفاع و عرض 200 پیکسل تغییر دهید. این را به PhotoImage سازگار با Tkinter تبدیل کنید تا در رابط کاربری گرافیکی نمایش داده شود.
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)
ساخت ساختار برنامه
سه برچسب برای نمایش عنوان دستور غذا، تصویر و پیوند دستور غذا تعریف کنید. پنجره والد را که می خواهید در آن قرار دهید، متنی که می خواهید نمایش دهید و سبک قلمی که باید داشته باشد را تنظیم کنید. برای نمایش تصویر، ویژگی تصویر را روی photo_image قرار دهید. گزینه مکان نما را در برچسب پیوند روی hand2 قرار دهید تا قابل کلیک کردن باشد.
پیوند و رویداد کلیک چپ ماوس را برای فراخوانی تابع open_link () متصل کنید. همه ویجت ها را با استفاده از روش بسته سازماندهی کنید، آنها را به صورت افقی در مرکز قرار دهید و در صورت لزوم بالشتک را اضافه کنید. عنوان، تصاویر و پیوندها را به سه لیست مختلف اضافه کنید.
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)
یک روش، clear_recipe_list() برای پاک کردن کل محتوای صفحه تولید شده توسط درخواست قبلی تعریف کنید. محتویات لیست دستور العمل ها را پاک کنید و روی هر برچسب در لیست recipe_label تکرار کنید.
فراخوانی متد pack_forget() برای حذف برچسب از صفحه نمایش اما شیء ویجت دست نخورده باقی بماند.
لیست recipe_labels را برای داده های جدید پاک کنید. این روند را برای تصاویر و لینک ها نیز تکرار کنید. یک روش، open_link() برای باز کردن پیوند دستور غذا در مرورگر وب پیش فرض خود تعریف کنید.
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)
پنجره ریشه Tkinter را راه اندازی کنید. عنوان، ابعاد و رنگ پس زمینه برنامه را تنظیم کنید. یک ویجت فریم را تعریف کنید و عنصر اصلی آن را به همراه رنگ پسزمینه آن تنظیم کنید. یک برچسب، یک ورودی و یک دکمه جستجو ایجاد کنید. همه ویجت ها را با استفاده از روش بسته سازماندهی کنید و در صورت لزوم بالشتک اضافه کنید.
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)
یک بوم با پسزمینه سفید ایجاد کنید تا ویجتهایی را که اطلاعات دستور غذا را در خود نگه میدارند نمایش دهید. آن را در سمت چپ پنجره سازماندهی کنید، تمام فضای قاب را در هر دو جهت بگیرید و با تغییر اندازه آن را گسترش دهید.
یک نوار اسکرول عمودی برای بوم ایجاد کنید و آن را در سمت راست آن قرار دهید. متد scrollbar.set را به روش canvas.yview پیوند دهید تا با پیمایش نوار اسکرول، محتوای بوم پیمایش شود.
یک قاب در داخل بوم ایجاد کنید تا به عنوان ظرفی برای اقلام دستور غذا عمل کند و در سمت چپ بالای پنجره لنگر بیاندازد. رویداد
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"))
)
لیستی را برای دستور العمل ها، برچسب ها، تصاویر و پیوندها تعریف کنید. تابع mainloop() به پایتون می گوید که حلقه رویداد Tkinter را اجرا کند و تا زمانی که پنجره را ببندید به رویدادها گوش دهد.
recipe_list = []
recipe_labels = []
recipe_images = []
recipe_links = []
root.mainloop()
همه اینها را کنار هم بگذارید و با یک کلیک غذاها را کشف کنید.
خروجی برنامه Recipe Finder
با اجرای برنامه و وارد کردن ظرف به عنوان برگر مرغ، پنج نتیجه برتر را دریافت می کنید. این شامل عنوان، تصویر و لینک دستور غذایی است که وارد کرده اید. با کلیک بر روی پیوند، مرورگر وب پیش فرض پیوند دستور غذا را باز می کند. با اسکرول کردن به پایین، اندازه محتوا ثابت می ماند و نتایج مختلف را به صورت افقی در مرکز نمایش می دهد.
بهبود برنامه Recipe Finder
برای بهبود برنامه یاب دستور غذا، میتوانید فیلتر و مرتبسازی را بر اساس اولویتهای مختلف اجرا کنید. می توانید یک ظرف را بر اساس ترجیح غذایی، زمان پخت و غذا فیلتر کنید و آنها را به هر ترتیبی مرتب کنید.
یک ویژگی برای نشانک کردن دستور العمل های مورد علاقه خود برای مشاهده بعدا و گزینه ای برای اشتراک گذاری آنها در رسانه های اجتماعی ایجاد کنید. میتوانید دستهبندی ایجاد کنید تا غذاهایی که بیشتر جستجو شدهاند، بیشترین نشانکگذاری شدهها و غیره را پیدا کنید.
با ترکیب مهارت های برنامه نویسی و ویژگی های قدرتمند API ها، می توانید این برنامه پایه را بیشتر به یک برنامه کامل تبدیل کنید.