import gradio as gr import pandas as pd # Function to load the menu data from Excel def load_menu(): menu_file = "menu.xlsx" # Ensure this file exists in the same directory try: return pd.read_excel(menu_file) except Exception as e: raise ValueError(f"Error loading menu file: {e}") # Function to filter menu items based on preference def filter_menu(preference): menu_data = load_menu() if preference == "Halal/Non-Veg": filtered_data = menu_data[menu_data["Ingredients"].str.contains("Chicken|Mutton|Fish|Prawns|Goat", case=False, na=False)] elif preference == "Vegetarian": filtered_data = menu_data[~menu_data["Ingredients"].str.contains("Chicken|Mutton|Fish|Prawns|Goat", case=False, na=False)] elif preference == "Guilt-Free": filtered_data = menu_data[menu_data["Description"].str.contains(r"Fat: ([0-9]|10)g", case=False, na=False)] else: # Default to "All" filtered_data = menu_data # Generate HTML for the menu html_content = "" for _, item in filtered_data.iterrows(): html_content += f"""

{item['Dish Name']}

${item['Price ($)']}

{item['Description']}

{item['Dish Name']}
""" return html_content # Function to render dish details for the suggestion page def render_dish_details(dish_name): print(f"Dish name received: {dish_name}") # Debugging line menu_data = load_menu() try: dish = menu_data[menu_data["Dish Name"] == dish_name].iloc[0] return ( dish["Image URL"], dish_name, dish["Description"], f"${dish['Price ($)']}" ) except IndexError: raise ValueError(f"Dish '{dish_name}' not found!") # Gradio app definition def app(): with gr.Blocks() as demo: gr.Markdown("## Menu with Dynamic Filters") selected_dish = gr.State("") # State for the selected dish name # Menu components preference_selector = gr.Radio( choices=["All", "Vegetarian", "Halal/Non-Veg", "Guilt-Free"], value="All", label="Choose a Preference" ) menu_html = gr.HTML(value=filter_menu("All")) # Suggestion page components suggestion_page = gr.Column(visible=False) dish_image = gr.Image(label="Dish Image") dish_name = gr.Markdown() dish_description = gr.Markdown() dish_price = gr.Markdown() # Functions def update_menu(preference): return filter_menu(preference) def show_suggestion(dish_name): try: img, name, desc, price = render_dish_details(dish_name) return ( gr.update(visible=False), gr.update(visible=True), img, f"## {name}", desc, price ) except ValueError as e: return ( gr.update(visible=True), gr.update(visible=False), "", f"Error: {str(e)}", "", "" ) # Event Handlers preference_selector.change( update_menu, inputs=[preference_selector], outputs=[menu_html] ) menu_html.change( show_suggestion, inputs=[selected_dish], outputs=[menu_html, suggestion_page, dish_image, dish_name, dish_description, dish_price] ) # Layout with gr.Row(): menu_html with suggestion_page: dish_image dish_name dish_description dish_price return demo if __name__ == "__main__": demo = app() demo.launch()