import gradio as gr import io import sys # Inventory data Inventory = [ (1, "Apples", 250), (2, "Cherry", 650), (3, "Chickoo", 50), (4, "Grapes", 90), (5, "Mangoes", 150), ] # Existing functions (ensure these are defined or imported in your final app.py) # get_inventory_string # get_cart_string # add_item_to_cart # remove_item_from_cart def get_inventory_string(inventory_list): output_buffer = io.StringIO() print_func = lambda *args, **kwargs: print(*args, file=output_buffer, **kwargs) print_func(" " + "=" * 50) print_func(" " * 15 + "PRODUCT INVENTORY (PRICES)") print_func("=" * 50) print_func(f"{'ID':<5}{'Product Name':<20}{'Price/Kg':>15}") print_func("-" * 50) for item_id, product_name, price_per_kg in inventory_list: print_func(f"{item_id:<5}{product_name:<20}{price_per_kg:>15.2f}") print_func("=" * 50) return output_buffer.getvalue() def get_cart_string(cart_dict): output_buffer = io.StringIO() print_func = lambda *args, **kwargs: print(*args, file=output_buffer, **kwargs) print_func(" " + "=" * 50) print_func(" " * 18 + "SHOPPING CART") print_func("=" * 50) print_func(f"{'Product Name':<15}{'Quantity(Kg)':>12}{'Price/Kg':>12}{'Subtotal':>11}") print_func("-" * 50) total_bill = 0 if not cart_dict: print_func(" " * 18 + "Cart is empty!") else: for product_name, details in cart_dict.items(): qty = details['quantity'] price_per_kg = details['price_per_kg'] item_total = qty * price_per_kg total_bill += item_total print_func(f"{product_name:<15}{qty:>12.2f}{price_per_kg:>12.2f}{item_total:>11.2f}") print_func("=" * 50) print_func(f"{'Total Bill:':<38}{total_bill:>11.2f}") print_func("=" * 50) return output_buffer.getvalue() def add_item_to_cart(cart, item_id_to_add, quantity_to_add, inventory_list): found_in_inventory = False for item_id, product_name, price_per_kg in inventory_list: if item_id == item_id_to_add: found_in_inventory = True if product_name in cart: cart[product_name]['quantity'] += quantity_to_add else: cart[product_name] = {'quantity': quantity_to_add, 'price_per_kg': price_per_kg} return True, f"Added {quantity_to_add} Kg of {product_name} (ID: {item_id_to_add}) to cart. Price/Kg: ${price_per_kg:.2f}" if not found_in_inventory: return False, f"Error: Product with ID '{item_id_to_add}' not found in inventory." def remove_item_from_cart(cart, item_id_to_remove, quantity_to_remove, inventory_list): product_name_to_remove = None for item_id, product_name, _ in inventory_list: if item_id == item_id_to_remove: product_name_to_remove = product_name break if not product_name_to_remove: return False, f"Error: Product with ID '{item_id_to_remove}' not found in inventory." if product_name_to_remove not in cart: return False, f"Error: '{product_name_to_remove}' (ID: {item_id_to_remove}) is not in the cart." current_quantity = cart[product_name_to_remove]['quantity'] if quantity_to_remove >= current_quantity: del cart[product_name_to_remove] return True, f"Removed all {current_quantity} Kg of '{product_name_to_remove}' (ID: {item_id_to_remove}) from cart." else: cart[product_name_to_remove]['quantity'] -= quantity_to_remove return True, f"Removed {quantity_to_remove} Kg of '{product_name_to_remove}' (ID: {item_id_to_remove}) from cart. Remaining: {cart[product_name_to_remove]['quantity']} Kg." def gradio_add_item(cart, item_id_to_add, quantity_to_add): success, message = add_item_to_cart(cart, item_id_to_add, quantity_to_add, Inventory) return cart, message, get_cart_string(cart) def gradio_remove_item(cart, item_id_to_remove, quantity_to_remove): success, message = remove_item_from_cart(cart, item_id_to_remove, quantity_to_remove, Inventory) return cart, message, get_cart_string(cart) def gradio_display_cart_wrapper(cart): return get_cart_string(cart) with gr.Blocks() as demo: gr.Markdown("# Shopping Cart Management System") cart_state = gr.State(value={}) with gr.Tab("Add/Remove Items"): gr.Markdown("## Inventory") gr.Textbox(value=get_inventory_string(Inventory), label="Available Products", interactive=False, lines=10) with gr.Row(): with gr.Column(): gr.Markdown("### Add Item to Cart") add_id = gr.Number(label="Product ID to Add", value=1) add_qty = gr.Number(label="Quantity (Kg)", value=1.0) add_btn = gr.Button("Add to Cart") add_output = gr.Textbox(label="Status", interactive=False) with gr.Column(): gr.Markdown("### Remove Item from Cart") remove_id = gr.Number(label="Product ID to Remove", value=1) remove_qty = gr.Number(label="Quantity (Kg)", value=1.0) remove_btn = gr.Button("Remove from Cart") remove_output = gr.Textbox(label="Status", interactive=False) current_cart_display = gr.Textbox(label="Current Shopping Cart", interactive=False, lines=None) add_btn.click( gradio_add_item, inputs=[cart_state, add_id, add_qty], outputs=[cart_state, add_output, current_cart_display] ) remove_btn.click( gradio_remove_item, inputs=[cart_state, remove_id, remove_qty], outputs=[cart_state, remove_output, current_cart_display] ) demo.load(gradio_display_cart_wrapper, inputs=cart_state, outputs=current_cart_display) with gr.Tab("View Cart"): gr.Markdown("## Your Shopping Cart") view_cart_display = gr.Textbox(label="Shopping Cart Contents", interactive=False, lines=None) cart_state.change( gradio_display_cart_wrapper, inputs=cart_state, outputs=view_cart_display ) # Initial load for the View Cart tab demo.load(gradio_display_cart_wrapper, inputs=cart_state, outputs=view_cart_display) demo.launch(share=True)