Spaces:
Sleeping
Sleeping
File size: 4,839 Bytes
a691ebc 078431c 8edd0c3 078431c 7ad0ad6 a355a11 81886a7 a355a11 078431c 7ad0ad6 a355a11 7ad0ad6 8edd0c3 f3efaf1 078431c 81886a7 a691ebc e83450b a691ebc c57f3fe 9b46be7 31bbffa fa52bb5 31bbffa fa52bb5 31bbffa 78200a1 9b46be7 31bbffa 9b46be7 a691ebc e83450b 81886a7 c57f3fe 81886a7 f3efaf1 078431c 81886a7 f3efaf1 c57f3fe e83450b fa52bb5 e83450b fa52bb5 a691ebc f3efaf1 a691ebc fa52bb5 c57f3fe c5c590b c57f3fe c5c590b c57f3fe 78200a1 c5c590b 1862eb6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
import gradio as gr
import pandas as pd
# Load menu data from Excel file
def load_menu(file_path="menu.xlsx"):
menu_df = pd.read_excel(file_path)
menu_df.columns = menu_df.columns.str.strip().str.lower()
column_mapping = {
"name": next((col for col in menu_df.columns if "name" in col), None),
"price": next((col for col in menu_df.columns if "price" in col), None),
"description": next((col for col in menu_df.columns if "description" in col), None),
"image": next((col for col in menu_df.columns if "image" in col), None),
}
missing_columns = [key for key, col in column_mapping.items() if col is None]
if missing_columns:
raise ValueError(f"Excel file is missing one or more required columns: {missing_columns}")
menu = []
for _, row in menu_df.iterrows():
menu.append({
"name": row[column_mapping["name"]],
"price": row[column_mapping["price"]],
"description": row[column_mapping["description"]],
"image": row[column_mapping["image"]],
})
return menu
# Initialize menu and cart
menu_data = load_menu("menu.xlsx")
cart = {}
# Function to render the menu
def display_menu():
"""
Generate the menu as HTML with functional Add buttons tied to Gradio's backend.
"""
menu_html = ""
for item in menu_data:
if item["name"] in cart:
# Quantity selector if the item is already in the cart
menu_html += f"""
<div style="display: flex; align-items: center; margin-bottom: 15px; border: 1px solid #ddd; padding: 10px; border-radius: 5px;">
<img src="{item['image']}" alt="{item['name']}" style="width: 80px; height: 80px; border-radius: 5px; margin-right: 15px;">
<div>
<h4 style="margin: 0;">{item['name']} - ${item['price']}</h4>
<p style="font-size: 12px; color: gray;">{item['description']}</p>
</div>
<div style="margin-left: auto; display: flex; align-items: center;">
<button style="background-color: #dc3545; color: white; border: none; padding: 5px; border-radius: 5px;">-</button>
<span style="margin: 0 10px;">{cart[item['name']]['quantity']}</span>
<button style="background-color: #28a745; color: white; border: none; padding: 5px; border-radius: 5px;">+</button>
</div>
</div>
"""
else:
# Add button if the item is not in the cart
menu_html += f"""
<div style="display: flex; align-items: center; margin-bottom: 15px; border: 1px solid #ddd; padding: 10px; border-radius: 5px;">
<img src="{item['image']}" alt="{item['name']}" style="width: 80px; height: 80px; border-radius: 5px; margin-right: 15px;">
<div>
<h4 style="margin: 0;">{item['name']} - ${item['price']}</h4>
<p style="font-size: 12px; color: gray;">{item['description']}</p>
</div>
<button style="background-color: #28a745; color: white; border: none; padding: 8px 12px; border-radius: 5px; cursor: pointer; margin-left: auto;">Add</button>
</div>
"""
return menu_html
# Function to add items to the cart
def add_to_cart(item_name):
"""
Add an item to the cart and return the updated menu and cart summary.
"""
if item_name in cart:
cart[item_name]["quantity"] += 1
else:
for item in menu_data:
if item["name"] == item_name:
cart[item_name] = {
"name": item["name"],
"price": item["price"],
"quantity": 1
}
break
return display_menu(), update_cart_summary()
# Function to update the cart summary
def update_cart_summary():
"""
Update the cart summary with the total number of items and the total price.
"""
num_items = sum(item["quantity"] for item in cart.values())
total_price = sum(item["price"] * item["quantity"] for item in cart.values())
return f"{num_items} items added to cart. Total: ${total_price:.2f}"
# Gradio Interface
with gr.Blocks() as demo:
gr.Markdown("# Dynamic Food Menu")
# Menu display
menu_html = gr.HTML(value=display_menu())
cart_summary = gr.HTML(value="No items added to cart.")
# Hidden input for item name
item_name_input = gr.Textbox(visible=False)
# Add Button Logic
add_button = gr.Button("Add to Cart", visible=False)
add_button.click(fn=add_to_cart, inputs=item_name_input, outputs=[menu_html, cart_summary])
# Add Menu and Cart Summary to Gradio Blocks
menu_html
cart_summary
demo.launch() |