Update app.py
Browse files
app.py
CHANGED
|
@@ -6,16 +6,13 @@ from chatbot_nuti import buscar_respuesta
|
|
| 6 |
from coach_emocional import coach_emocional_inteligente
|
| 7 |
from retos_saludables import mostrar_retos, completar_reto
|
| 8 |
|
| 9 |
-
# ---------- MEMORIA
|
| 10 |
MEMORIA_NUTI = []
|
| 11 |
MEMORIA_COACH = []
|
| 12 |
|
| 13 |
-
# ---------- VARIABLES GLOBALES ---------- #
|
| 14 |
calorias_totales = 0
|
| 15 |
calorias_restantes = 0
|
| 16 |
historial_comidas = []
|
| 17 |
-
RECETAS = []
|
| 18 |
-
|
| 19 |
|
| 20 |
# ---------- CHATBOT NUTI ---------- #
|
| 21 |
def conversar_nuti(mensaje, historial):
|
|
@@ -25,7 +22,6 @@ def conversar_nuti(mensaje, historial):
|
|
| 25 |
historial = historial + [(mensaje, respuesta)]
|
| 26 |
return historial, ""
|
| 27 |
|
| 28 |
-
|
| 29 |
# ---------- COACH EMOCIONAL ---------- #
|
| 30 |
def conversar_coach(mensaje, historial):
|
| 31 |
MEMORIA_COACH.append({"user": mensaje})
|
|
@@ -34,7 +30,6 @@ def conversar_coach(mensaje, historial):
|
|
| 34 |
historial = historial + [(mensaje, respuesta)]
|
| 35 |
return historial, ""
|
| 36 |
|
| 37 |
-
|
| 38 |
# ---------- CÁLCULO DE CALORÍAS ---------- #
|
| 39 |
def calcular_calorias(edad, peso, altura, genero, actividad, meta):
|
| 40 |
global calorias_totales, calorias_restantes
|
|
@@ -53,6 +48,7 @@ def calcular_calorias(edad, peso, altura, genero, actividad, meta):
|
|
| 53 |
|
| 54 |
calorias_base = bmr * factores.get(actividad.lower(), 1.55)
|
| 55 |
|
|
|
|
| 56 |
if meta.lower() == "bajar de peso":
|
| 57 |
calorias_totales = round(calorias_base * 0.8)
|
| 58 |
elif meta.lower() == "subir de peso":
|
|
@@ -63,15 +59,13 @@ def calcular_calorias(edad, peso, altura, genero, actividad, meta):
|
|
| 63 |
calorias_restantes = calorias_totales
|
| 64 |
return f"🎯 Tu meta es **{meta.lower()}**.\n🔥 Puedes consumir aproximadamente **{calorias_totales} calorías por día**."
|
| 65 |
|
| 66 |
-
|
| 67 |
-
# ---------- RELOJ INTELIGENTE ---------- #
|
| 68 |
def calorias_reloj(calorias_quemadas):
|
| 69 |
global calorias_restantes
|
| 70 |
calorias_restantes += calorias_quemadas
|
| 71 |
-
return f"⌚ Has quemado **{calorias_quemadas} kcal
|
| 72 |
-
|
| 73 |
|
| 74 |
-
# ----------
|
| 75 |
def analizar_foto(imagen):
|
| 76 |
if imagen is None:
|
| 77 |
return "⚠️ Sube una foto de tu comida.", 0
|
|
@@ -88,7 +82,6 @@ def analizar_foto(imagen):
|
|
| 88 |
nombre, calorias = random.choice(comidas)
|
| 89 |
return f"🍽️ Parece que comiste **{nombre}** (~{calorias} kcal).", calorias
|
| 90 |
|
| 91 |
-
|
| 92 |
def registrar_comida(imagen):
|
| 93 |
global calorias_restantes, historial_comidas
|
| 94 |
info, calorias = analizar_foto(imagen)
|
|
@@ -98,7 +91,6 @@ def registrar_comida(imagen):
|
|
| 98 |
historial_comidas.append({"comida": info, "calorias": calorias})
|
| 99 |
return f"{info}\n\n🔥 Calorías restantes del día: **{calorias_restantes} kcal**."
|
| 100 |
|
| 101 |
-
|
| 102 |
def mostrar_historial():
|
| 103 |
if not historial_comidas:
|
| 104 |
return "📭 Aún no has registrado comidas hoy."
|
|
@@ -108,15 +100,14 @@ def mostrar_historial():
|
|
| 108 |
texto += f"\n🔥 Te quedan **{calorias_restantes} kcal** por consumir hoy."
|
| 109 |
return texto
|
| 110 |
|
| 111 |
-
|
| 112 |
# ---------- RECETAS ---------- #
|
|
|
|
| 113 |
def subir_receta(nombre, descripcion, imagen):
|
| 114 |
if nombre and descripcion:
|
| 115 |
RECETAS.append({"nombre": nombre, "descripcion": descripcion, "imagen": imagen})
|
| 116 |
return f"✅ Receta '{nombre}' añadida correctamente."
|
| 117 |
return "⚠️ Ingresa nombre y descripción."
|
| 118 |
|
| 119 |
-
|
| 120 |
def mostrar_recetas():
|
| 121 |
if not RECETAS:
|
| 122 |
return "📭 No hay recetas cargadas aún."
|
|
@@ -125,13 +116,15 @@ def mostrar_recetas():
|
|
| 125 |
texto += f"**{r['nombre']}**\n{r['descripcion']}\n\n"
|
| 126 |
return texto
|
| 127 |
|
| 128 |
-
|
| 129 |
# ---------- BUSCADOR DE NUTRIÓLOGOS ---------- #
|
| 130 |
def buscar_nutriologos(pais, estado, ciudad):
|
| 131 |
ejemplos = [
|
| 132 |
-
{"nombre": "Dra. Sofía Martínez", "pais": "México", "estado": "Sonora", "ciudad": "Hermosillo",
|
| 133 |
-
|
| 134 |
-
{"nombre": "
|
|
|
|
|
|
|
|
|
|
| 135 |
]
|
| 136 |
resultados = [n for n in ejemplos if n["pais"].lower() == pais.lower() or n["ciudad"].lower() == ciudad.lower() or n["estado"].lower() == estado.lower()]
|
| 137 |
if not resultados:
|
|
@@ -141,13 +134,13 @@ def buscar_nutriologos(pais, estado, ciudad):
|
|
| 141 |
texto += f"**{n['nombre']}** - {n['especialidad']} ({n['ciudad']}, {n['pais']})\n📱 {n['redes']}\n💬 {n['reseña']}\n\n"
|
| 142 |
return texto
|
| 143 |
|
| 144 |
-
|
| 145 |
-
# ---------- INTERFAZ ---------- #
|
| 146 |
def main():
|
| 147 |
with gr.Blocks(title="NutriBot IA 🥗") as app:
|
| 148 |
gr.Markdown("# 🧠 Bienvenido a **NutriBot IA** 🍎")
|
| 149 |
-
gr.Markdown("Comer sano, inteligente y divertido
|
| 150 |
|
|
|
|
| 151 |
with gr.Tab("👤 Datos Personales"):
|
| 152 |
with gr.Row():
|
| 153 |
nombre = gr.Textbox(label="Nombre completo")
|
|
@@ -158,23 +151,35 @@ def main():
|
|
| 158 |
actividad = gr.Dropdown(["Sedentario", "Ligero", "Moderado", "Activo", "Muy activo"], label="Nivel de actividad física")
|
| 159 |
meta = gr.Radio(["Bajar de peso", "Mantener peso", "Subir de peso"], label="🎯 Meta personal")
|
| 160 |
|
| 161 |
-
condicion = gr.Textbox(label="🩺
|
| 162 |
-
|
| 163 |
|
| 164 |
guardar_datos = gr.Button("Guardar información 🧾")
|
| 165 |
salida_datos = gr.Markdown()
|
| 166 |
|
| 167 |
-
def guardar_informacion(nombre, edad, peso, altura, genero, actividad, meta, condicion):
|
| 168 |
-
perfil = {
|
| 169 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 170 |
with open("perfil_usuario.json", "w") as f:
|
| 171 |
json.dump(perfil, f, indent=4)
|
| 172 |
-
return f"✅ Información guardada
|
| 173 |
|
| 174 |
-
guardar_datos.click(
|
| 175 |
-
|
| 176 |
-
|
|
|
|
|
|
|
| 177 |
|
|
|
|
| 178 |
with gr.Tab("📸 Registro de Comidas"):
|
| 179 |
gr.Markdown("Sube una foto de tu comida y NutriBot estimará las calorías 🍽️")
|
| 180 |
imagen = gr.Image(label="Foto de tu comida", type="filepath")
|
|
@@ -186,36 +191,41 @@ def main():
|
|
| 186 |
salida_historial = gr.Markdown()
|
| 187 |
boton_historial.click(mostrar_historial, outputs=salida_historial)
|
| 188 |
|
|
|
|
| 189 |
with gr.Tab("⌚ Calorías del Reloj"):
|
| 190 |
calorias_quemadas = gr.Number(label="Calorías quemadas (reloj inteligente)")
|
| 191 |
boton_reloj = gr.Button("Actualizar 🔁")
|
| 192 |
salida_reloj = gr.Markdown()
|
| 193 |
boton_reloj.click(calorias_reloj, inputs=[calorias_quemadas], outputs=salida_reloj)
|
| 194 |
|
|
|
|
| 195 |
with gr.Tab("🤖 Chat con Nuti"):
|
| 196 |
chat_nuti = gr.Chatbot(label="Nuti - Tu guía de nutrición 🍎")
|
| 197 |
entrada_nuti = gr.Textbox(label="Escribe algo para Nuti...")
|
| 198 |
boton_nuti = gr.Button("Enviar")
|
| 199 |
boton_nuti.click(conversar_nuti, inputs=[entrada_nuti, chat_nuti], outputs=[chat_nuti, entrada_nuti])
|
| 200 |
|
|
|
|
| 201 |
with gr.Tab("🧘 Coach Emocional"):
|
| 202 |
chat_coach = gr.Chatbot(label="Coach Emocional 🌿")
|
| 203 |
entrada_coach = gr.Textbox(label="Cuéntame cómo te sientes hoy...")
|
| 204 |
boton_coach = gr.Button("Enviar")
|
| 205 |
boton_coach.click(conversar_coach, inputs=[entrada_coach, chat_coach], outputs=[chat_coach, entrada_coach])
|
| 206 |
|
|
|
|
| 207 |
with gr.Tab("🍽️ Recetas del Nutriólogo"):
|
| 208 |
-
|
| 209 |
descripcion = gr.Textbox(label="Descripción o ingredientes")
|
| 210 |
imagen_receta = gr.Image(label="Imagen (opcional)")
|
| 211 |
boton_subir = gr.Button("Subir receta")
|
| 212 |
salida_subir = gr.Textbox(label="Estado")
|
| 213 |
-
boton_subir.click(subir_receta, inputs=[
|
| 214 |
|
| 215 |
boton_ver = gr.Button("Ver recetas disponibles 🍲")
|
| 216 |
salida_recetas = gr.Markdown()
|
| 217 |
boton_ver.click(mostrar_recetas, outputs=salida_recetas)
|
| 218 |
|
|
|
|
| 219 |
with gr.Tab("🎯 Retos Saludables"):
|
| 220 |
salida_retos = gr.Markdown()
|
| 221 |
boton_ver_retos = gr.Button("Ver Retos del Día")
|
|
@@ -225,6 +235,7 @@ def main():
|
|
| 225 |
boton_completar = gr.Button("Completar Reto 🏅")
|
| 226 |
boton_completar.click(completar_reto, inputs=[numero_reto], outputs=salida_retos)
|
| 227 |
|
|
|
|
| 228 |
with gr.Tab("🧑⚕️ Buscar Nutriólogos"):
|
| 229 |
pais = gr.Textbox(label="País")
|
| 230 |
estado = gr.Textbox(label="Estado")
|
|
@@ -235,6 +246,5 @@ def main():
|
|
| 235 |
|
| 236 |
app.launch()
|
| 237 |
|
| 238 |
-
|
| 239 |
if __name__ == "__main__":
|
| 240 |
main()
|
|
|
|
| 6 |
from coach_emocional import coach_emocional_inteligente
|
| 7 |
from retos_saludables import mostrar_retos, completar_reto
|
| 8 |
|
| 9 |
+
# ---------- MEMORIA ---------- #
|
| 10 |
MEMORIA_NUTI = []
|
| 11 |
MEMORIA_COACH = []
|
| 12 |
|
|
|
|
| 13 |
calorias_totales = 0
|
| 14 |
calorias_restantes = 0
|
| 15 |
historial_comidas = []
|
|
|
|
|
|
|
| 16 |
|
| 17 |
# ---------- CHATBOT NUTI ---------- #
|
| 18 |
def conversar_nuti(mensaje, historial):
|
|
|
|
| 22 |
historial = historial + [(mensaje, respuesta)]
|
| 23 |
return historial, ""
|
| 24 |
|
|
|
|
| 25 |
# ---------- COACH EMOCIONAL ---------- #
|
| 26 |
def conversar_coach(mensaje, historial):
|
| 27 |
MEMORIA_COACH.append({"user": mensaje})
|
|
|
|
| 30 |
historial = historial + [(mensaje, respuesta)]
|
| 31 |
return historial, ""
|
| 32 |
|
|
|
|
| 33 |
# ---------- CÁLCULO DE CALORÍAS ---------- #
|
| 34 |
def calcular_calorias(edad, peso, altura, genero, actividad, meta):
|
| 35 |
global calorias_totales, calorias_restantes
|
|
|
|
| 48 |
|
| 49 |
calorias_base = bmr * factores.get(actividad.lower(), 1.55)
|
| 50 |
|
| 51 |
+
# Ajuste según meta
|
| 52 |
if meta.lower() == "bajar de peso":
|
| 53 |
calorias_totales = round(calorias_base * 0.8)
|
| 54 |
elif meta.lower() == "subir de peso":
|
|
|
|
| 59 |
calorias_restantes = calorias_totales
|
| 60 |
return f"🎯 Tu meta es **{meta.lower()}**.\n🔥 Puedes consumir aproximadamente **{calorias_totales} calorías por día**."
|
| 61 |
|
| 62 |
+
# ---------- CALORÍAS DEL RELOJ ---------- #
|
|
|
|
| 63 |
def calorias_reloj(calorias_quemadas):
|
| 64 |
global calorias_restantes
|
| 65 |
calorias_restantes += calorias_quemadas
|
| 66 |
+
return f"⌚ Has quemado **{calorias_quemadas} kcal**. Te quedan **{calorias_restantes} kcal** disponibles hoy."
|
|
|
|
| 67 |
|
| 68 |
+
# ---------- FOTO DE COMIDA ---------- #
|
| 69 |
def analizar_foto(imagen):
|
| 70 |
if imagen is None:
|
| 71 |
return "⚠️ Sube una foto de tu comida.", 0
|
|
|
|
| 82 |
nombre, calorias = random.choice(comidas)
|
| 83 |
return f"🍽️ Parece que comiste **{nombre}** (~{calorias} kcal).", calorias
|
| 84 |
|
|
|
|
| 85 |
def registrar_comida(imagen):
|
| 86 |
global calorias_restantes, historial_comidas
|
| 87 |
info, calorias = analizar_foto(imagen)
|
|
|
|
| 91 |
historial_comidas.append({"comida": info, "calorias": calorias})
|
| 92 |
return f"{info}\n\n🔥 Calorías restantes del día: **{calorias_restantes} kcal**."
|
| 93 |
|
|
|
|
| 94 |
def mostrar_historial():
|
| 95 |
if not historial_comidas:
|
| 96 |
return "📭 Aún no has registrado comidas hoy."
|
|
|
|
| 100 |
texto += f"\n🔥 Te quedan **{calorias_restantes} kcal** por consumir hoy."
|
| 101 |
return texto
|
| 102 |
|
|
|
|
| 103 |
# ---------- RECETAS ---------- #
|
| 104 |
+
RECETAS = []
|
| 105 |
def subir_receta(nombre, descripcion, imagen):
|
| 106 |
if nombre and descripcion:
|
| 107 |
RECETAS.append({"nombre": nombre, "descripcion": descripcion, "imagen": imagen})
|
| 108 |
return f"✅ Receta '{nombre}' añadida correctamente."
|
| 109 |
return "⚠️ Ingresa nombre y descripción."
|
| 110 |
|
|
|
|
| 111 |
def mostrar_recetas():
|
| 112 |
if not RECETAS:
|
| 113 |
return "📭 No hay recetas cargadas aún."
|
|
|
|
| 116 |
texto += f"**{r['nombre']}**\n{r['descripcion']}\n\n"
|
| 117 |
return texto
|
| 118 |
|
|
|
|
| 119 |
# ---------- BUSCADOR DE NUTRIÓLOGOS ---------- #
|
| 120 |
def buscar_nutriologos(pais, estado, ciudad):
|
| 121 |
ejemplos = [
|
| 122 |
+
{"nombre": "Dra. Sofía Martínez", "pais": "México", "estado": "Sonora", "ciudad": "Hermosillo",
|
| 123 |
+
"especialidad": "Nutrición deportiva", "redes": "@nutrisofi (Instagram)", "reseña": "⭐️⭐️⭐️⭐️⭐️ 4.9"},
|
| 124 |
+
{"nombre": "Lic. Andrés Gómez", "pais": "México", "estado": "CDMX", "ciudad": "Coyoacán",
|
| 125 |
+
"especialidad": "Nutrición clínica", "redes": "@andresnutricion (TikTok)", "reseña": "⭐️⭐️⭐️⭐️ 4.7"},
|
| 126 |
+
{"nombre": "Dra. Camila Silva", "pais": "Chile", "estado": "Región Metropolitana", "ciudad": "Santiago",
|
| 127 |
+
"especialidad": "Salud emocional", "redes": "@camila.wellness (Instagram)", "reseña": "⭐️⭐️⭐️⭐️⭐️ 5.0"}
|
| 128 |
]
|
| 129 |
resultados = [n for n in ejemplos if n["pais"].lower() == pais.lower() or n["ciudad"].lower() == ciudad.lower() or n["estado"].lower() == estado.lower()]
|
| 130 |
if not resultados:
|
|
|
|
| 134 |
texto += f"**{n['nombre']}** - {n['especialidad']} ({n['ciudad']}, {n['pais']})\n📱 {n['redes']}\n💬 {n['reseña']}\n\n"
|
| 135 |
return texto
|
| 136 |
|
| 137 |
+
# ---------- INTERFAZ PRINCIPAL ---------- #
|
|
|
|
| 138 |
def main():
|
| 139 |
with gr.Blocks(title="NutriBot IA 🥗") as app:
|
| 140 |
gr.Markdown("# 🧠 Bienvenido a **NutriBot IA** 🍎")
|
| 141 |
+
gr.Markdown("Comer sano, inteligente y divertido.🌿")
|
| 142 |
|
| 143 |
+
# --- DATOS PERSONALES --- #
|
| 144 |
with gr.Tab("👤 Datos Personales"):
|
| 145 |
with gr.Row():
|
| 146 |
nombre = gr.Textbox(label="Nombre completo")
|
|
|
|
| 151 |
actividad = gr.Dropdown(["Sedentario", "Ligero", "Moderado", "Activo", "Muy activo"], label="Nivel de actividad física")
|
| 152 |
meta = gr.Radio(["Bajar de peso", "Mantener peso", "Subir de peso"], label="🎯 Meta personal")
|
| 153 |
|
| 154 |
+
condicion = gr.Textbox(label="🩺 Condición alimenticia o enfermedad", placeholder="Ejemplo: diabetes, hipertensión, intolerancia a la lactosa...")
|
| 155 |
+
alergias = gr.Textbox(label="🚫 Alergias alimenticias", placeholder="Ejemplo: maní, gluten, mariscos...")
|
| 156 |
|
| 157 |
guardar_datos = gr.Button("Guardar información 🧾")
|
| 158 |
salida_datos = gr.Markdown()
|
| 159 |
|
| 160 |
+
def guardar_informacion(nombre, edad, peso, altura, genero, actividad, meta, condicion, alergias):
|
| 161 |
+
perfil = {
|
| 162 |
+
"nombre": nombre,
|
| 163 |
+
"edad": edad,
|
| 164 |
+
"peso": peso,
|
| 165 |
+
"altura": altura,
|
| 166 |
+
"genero": genero,
|
| 167 |
+
"actividad": actividad,
|
| 168 |
+
"meta": meta,
|
| 169 |
+
"condicion": condicion,
|
| 170 |
+
"alergias": alergias
|
| 171 |
+
}
|
| 172 |
with open("perfil_usuario.json", "w") as f:
|
| 173 |
json.dump(perfil, f, indent=4)
|
| 174 |
+
return f"✅ Información guardada.\n**Condición:** {condicion or 'ninguna'}\n**Alergias:** {alergias or 'ninguna'}"
|
| 175 |
|
| 176 |
+
guardar_datos.click(
|
| 177 |
+
guardar_informacion,
|
| 178 |
+
inputs=[nombre, edad, peso, altura, genero, actividad, meta, condicion, alergias],
|
| 179 |
+
outputs=salida_datos
|
| 180 |
+
)
|
| 181 |
|
| 182 |
+
# --- REGISTRO DE COMIDAS --- #
|
| 183 |
with gr.Tab("📸 Registro de Comidas"):
|
| 184 |
gr.Markdown("Sube una foto de tu comida y NutriBot estimará las calorías 🍽️")
|
| 185 |
imagen = gr.Image(label="Foto de tu comida", type="filepath")
|
|
|
|
| 191 |
salida_historial = gr.Markdown()
|
| 192 |
boton_historial.click(mostrar_historial, outputs=salida_historial)
|
| 193 |
|
| 194 |
+
# --- RELOJ --- #
|
| 195 |
with gr.Tab("⌚ Calorías del Reloj"):
|
| 196 |
calorias_quemadas = gr.Number(label="Calorías quemadas (reloj inteligente)")
|
| 197 |
boton_reloj = gr.Button("Actualizar 🔁")
|
| 198 |
salida_reloj = gr.Markdown()
|
| 199 |
boton_reloj.click(calorias_reloj, inputs=[calorias_quemadas], outputs=salida_reloj)
|
| 200 |
|
| 201 |
+
# --- CHAT NUTI --- #
|
| 202 |
with gr.Tab("🤖 Chat con Nuti"):
|
| 203 |
chat_nuti = gr.Chatbot(label="Nuti - Tu guía de nutrición 🍎")
|
| 204 |
entrada_nuti = gr.Textbox(label="Escribe algo para Nuti...")
|
| 205 |
boton_nuti = gr.Button("Enviar")
|
| 206 |
boton_nuti.click(conversar_nuti, inputs=[entrada_nuti, chat_nuti], outputs=[chat_nuti, entrada_nuti])
|
| 207 |
|
| 208 |
+
# --- COACH EMOCIONAL --- #
|
| 209 |
with gr.Tab("🧘 Coach Emocional"):
|
| 210 |
chat_coach = gr.Chatbot(label="Coach Emocional 🌿")
|
| 211 |
entrada_coach = gr.Textbox(label="Cuéntame cómo te sientes hoy...")
|
| 212 |
boton_coach = gr.Button("Enviar")
|
| 213 |
boton_coach.click(conversar_coach, inputs=[entrada_coach, chat_coach], outputs=[chat_coach, entrada_coach])
|
| 214 |
|
| 215 |
+
# --- RECETAS --- #
|
| 216 |
with gr.Tab("🍽️ Recetas del Nutriólogo"):
|
| 217 |
+
nombre_rec = gr.Textbox(label="Nombre de la receta")
|
| 218 |
descripcion = gr.Textbox(label="Descripción o ingredientes")
|
| 219 |
imagen_receta = gr.Image(label="Imagen (opcional)")
|
| 220 |
boton_subir = gr.Button("Subir receta")
|
| 221 |
salida_subir = gr.Textbox(label="Estado")
|
| 222 |
+
boton_subir.click(subir_receta, inputs=[nombre_rec, descripcion, imagen_receta], outputs=salida_subir)
|
| 223 |
|
| 224 |
boton_ver = gr.Button("Ver recetas disponibles 🍲")
|
| 225 |
salida_recetas = gr.Markdown()
|
| 226 |
boton_ver.click(mostrar_recetas, outputs=salida_recetas)
|
| 227 |
|
| 228 |
+
# --- RETOS --- #
|
| 229 |
with gr.Tab("🎯 Retos Saludables"):
|
| 230 |
salida_retos = gr.Markdown()
|
| 231 |
boton_ver_retos = gr.Button("Ver Retos del Día")
|
|
|
|
| 235 |
boton_completar = gr.Button("Completar Reto 🏅")
|
| 236 |
boton_completar.click(completar_reto, inputs=[numero_reto], outputs=salida_retos)
|
| 237 |
|
| 238 |
+
# --- NUTRIÓLOGOS --- #
|
| 239 |
with gr.Tab("🧑⚕️ Buscar Nutriólogos"):
|
| 240 |
pais = gr.Textbox(label="País")
|
| 241 |
estado = gr.Textbox(label="Estado")
|
|
|
|
| 246 |
|
| 247 |
app.launch()
|
| 248 |
|
|
|
|
| 249 |
if __name__ == "__main__":
|
| 250 |
main()
|