Cách tạo app tìm công thức nấu ăn bằng Python

Không còn lãng phí thời gian tìm kiếm khi có sự trợ giúp của ứng dụng. Bài viết sẽ hướng dẫn bạn cách tạo app tìm công thức nấu ăn bằng Python.

Tạo app công thức nấu ăn bằng Python

Hiện có rất nhiều công thức nấu ăn trên khắp Internet với hàng trăm liên kết và quảng cáo, tìm ra công thức phù hợp thật sự là thử thách với nhiều người. Xây dựng một app tìm công thức cho bạn một trải nghiệm tuyệt vời với thiết kế nhất quán và loại bỏ tất cả kết quả khó chịu, gây sao nhãng.

Bằng cách triển khai ứng dụng này, bạn sẽ tăng cường kỹ năng trong truy vấn HTTP, quản lý khóa API, chỉnh sửa ảnh và xây dựng giao diện người dùng bao gồm update GUI năng động.

Cài đặt mô đun Tkinter, Requests, Pillow, và Webbrowser

Để xây dựng ứng dụng tìm công thức, bạn cần mô đun Tkinter, Requests, Pillow, và Webbrowser. Tkinter cho phép bạn tạo ứng dụng desktop. Nó cung cấp một loạt widget giúp phát triển GUI dễ hơn. Để cài Tkinter, mở terminal và chạy:

pip install tkinter

Mô đun Requests khiến việc tạo truy vấn HTTP trở nên đơn giản và trả về một đối tượng phản hồi, chứa dữ liệu như mã hóa, và trạng thái. Bạn có thể dùng nó để tìm nạp trình gọi thông tin ID, tạo công cụ kiểm tra trạng thái web, chuyển đổi tiền tệ hoặc ứng dụng tin tức. Để cài mô đun Requests, mở terminal và chạy:

pip install requests

Thư viện Pillow cung cấp khả năng xử lý ảnh, giúp chỉnh sửa, tạo, chuyển đổi định dạng file và lưu ảnh. Để cài mô đun Pillow, mở terminal và chạy:

pip install Pillow

Mô đun Webbrowser giúp bạn mở link bất kỳ trong trình duyệt mặc định. Nó là một phần của thư viện chuẩn Python. Vì thế, bạn không cần cài đặt nó bên ngoài.

Tạo khóa Edamam API để tìm công thức

Để tạo khóa Edamam Recipe Search API, hãy làm theo các bước sau:

1. Truy cập Edamam, click nút Signup API. Điền thông tin chi tiết, chọn gói Recipe Search API - Developer.

Edamam

2. Đăng nhập tài khoản, click nút the Accounts, rồi nhấn Go to Dashboard.

Đăng nhập tài khoản

3. Sau đó, click tab Applications và cuối cùng click nút View cạnh Recipe Search API.

Đăng nhập thành công Edamam

4. Sao chép Application IDApplication Keys, rồi lưu nó để dùng trong ứng dụng.

Xây dựng tính năng lấy top 5 công thức

Nhập các mô đun cần thiết. Xác định phương thức get_top_5_recipes() truy xuất tiêu đề, ảnh và liên kết của món ăn mà người dùng tìm kiếm. Dùng get() để lấy tên của món ăn người dùng đã tìm.

Nếu người dùng nhập một tên công thức, xác định URL cơ bản cho endpoint tìm kiếm công thức của Edamam. Chuyển app_id app_key bạn đã sao chép ban đầu để xác minh và ủy quyền các yêu cầu API.

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 = # Đặt ID app cho edamam api
        app_key = # Đặt khóa app cho edamam api

Tạo từ điển, params chứa các tham số khác nhau mà bạn phải chuyển như một phần của truy vấn API. Đặt các cặp key-value của q & app_key cho giá trị bạn đã nhận ban đầu. Đặt các tham số fromto để thể hiện số lượng kết quả bạn muốn thấy.

Gửi truy vấn GET tới Edamam API kết hợp API URL và từ điển params. Lưu trữ phản hồi và xuất nó ở định dạng JSON. Gọi clear_recipe_list() để xóa công thức nằm trên màn hình khỏi các truy vấn trước đó.

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

Kiểm tra xem key, hits có hiện trong dữ liệu JSON được trích xuất và nếu nó đã nằm trong kết quả tìm kiếm hay chưa. Nếu có, lặp kết quả tìm kiếm và lần lượt truy xuất thông tin công thức. Gửi truy vấn GET tới URL ảnh với tham số stream được đặt sang True để cho phép truyền dữ liệu ảnh.

Dùng class Image của mô đun Pillow để mở ảnh đã nhận. Chỉnh lại kích thước của nó sao cho chiều cao và rộng bằng 200 pixel nhờ công cụ tái tạo mẫu Lanczos cho chất lượng cao. Chuyển đổi PhotoImage tương thích Tkinter để hiện nó trên giao diện người dùng đồ họa.

        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)

Xây dựng cấu trúc ứng dụng

Xác định 3 nhãn để hiện tên công thức, ảnh và link tới công thức. Đặt cửa sổ cha bạn muốn đặt nó vào bên trong, nội dung bạn muốn hiện và kiểu font cho text. Để hiện ảnh, đặt thuộc tính image sang photo_image. Đặt tùy chọn cursor trong nhãn link sang hand2 để người dùng có thể click vào nó.

Liên kết link và sự kiện click chuột trái để gọi hàm open_link. Sắp xếp tất cả widget bằng phương thức pack, căn giữa chúng theo chiều ngang, thêm padding khi cần. Nối tiêu đề, ảnh và link với 3 danh sách khác nhau.

                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)

Xác định phương thức, clear_recipe_list() để xóa nội dung được tạo bởi truy vấn trước đó trên toàn màn hình. Xóa nội dung của danh sách công thức và lặp qua từng nhãn trong danh sách recipe_label.

Gọi pack_forget() để loại bỏ nhãn từ màn hình nhưng nhớ giữ lại đối tượng widget.

Xóa danh sách recipe_labels cho dữ liệu mới. Lặp quá trình này cho ảnh và cả link. Xác định phương thức, open_link() để mở liên kết công thức trong trình duyệt web mặc định.

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)

Khởi tạo cửa sổ gốc Tkinter. Đặt tiêu đề, kích thước và màu nền của ứng dụng. Xác định widget khung hình và đặt phần tử cha của nó cùng với màu nền. Tạo một nhãn, mục và nút tìm kiếm. Sắp xếp toàn bộ widget bằng pack và thêm padding khi cần.

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)

Tạo một canvas nền trắng để hiện các widget chứa thông tin công thức nấu ăn. Sắp xếp nó sang bên trái của cửa sổ, lấy tất cả không gian trong khung theo cả hai hướng và mở rộng nó khi thay đổi kích thước.

Tạo một thanh cuộn dọc cho canvas và đặt nó sang bên phải. Liên kết phương thức scrollbar.set với canvas.yview để việc cuộn thanh cuộn sẽ cuộn nội dung trên canvas.

Tạo một khung bên trong canvas làm container cho các mục công thức, cố định ở phía trên bên trái của cửa sổ. Liên kết với sự kiện <Configure> để đảm bảo rằng box đó có thể cuộn chính xác khi nội dung bên trong box thay đổi hoặc thay đổi kích thước.

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

Xác định danh sách công thức nấu ăn, nhãn, hình ảnh và liên kết. Hàm mainloop() yêu cầu Python chạy vòng lặp sự kiện Tkinter và lắng nghe các sự kiện cho đến khi bạn đóng cửa sổ.

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

root.mainloop()

Đặt toàn bộ code lại với nhau và khám phá công thức nấu ăn bằng một click vào nút bấm.
Kết quả:

Kết quả tạo ứng dụng tìm công thức nấu ăn

Trên đây là cách làm ứng dụng tìm công thức nấu ăn bằng Python. Hi vọng bài viết hữu ích với các bạn.

Thứ Hai, 14/08/2023 17:26
53 👨 297
0 Bình luận
Sắp xếp theo
    ❖ Python