Preparar a los estudiantes con un flujo de trabajo moderno como el que se propone (GitHub Codespaces -> Streamlit) es una habilidad muy valiosa. Integrar el concepto de entornos virtuales desde el principio es la mejor práctica.
Esta guía considera las “reacciones” del IDE (Programación Reactiva) que son exactamente el tipo de detalles que pueden confundir a los principiantes y que, una vez explicados, se convierten en poderosas lecciones.
Incorporar la instalación de la extensión de Python y la explicación del reenvío de puertos desde el principio hará la guía mucho más robusta y anticipará dudas.
La siguiente es una propuesta de ejercicio completo, paso a paso,
diseñado para ser desarrollado íntegramente en GitHub
Codespaces. El proyecto integra las tres áreas de ingeniería
que mencionas y está diseñado para introducir los módulos
streamlit
y pandas
de una manera muy práctica
y aplicada.
Crear una aplicación web interactiva con Streamlit que sirva como una
caja de herramientas digital para cálculos y registros básicos en
Ingeniería Agrícola, Civil y Agroindustrial. Los estudiantes practicarán
la creación de entornos virtuales, la gestión
de dependencias con pip
, la importación y uso de
módulos (streamlit
y pandas
), la organización
del código en funciones y la interacción con el usuario a través de una
interfaz web. Además, aprenderán sobre la importancia de las
extensiones del IDE y el manejo de
puertos en entornos de desarrollo en la nube.
“Como futuros ingenieros, a menudo necesitarán realizar cálculos rápidos o llevar registros sencillos en campo. En lugar de depender de múltiples hojas de cálculo, construiremos una aplicación web centralizada y profesional. Aprenderemos a usar herramientas modernas como GitHub Codespaces, a mantener nuestro proyecto aislado y reproducible utilizando entornos virtuales, y a comprender cómo las extensiones del editor y la gestión de puertos son fundamentales para nuestro desarrollo. Esta herramienta nos permitirá seleccionar nuestra especialidad y realizar una tarea específica, aplicando los conocimientos de programación adquiridos.”
herramienta-ingenieria-streamlit
Dentro de tu nuevo repositorio en GitHub, haz clic en el botón
verde < > Code
.
Ve a la pestaña “Codespaces”.
Haz clic en “Create codespace on main”.
Espera un momento mientras GitHub prepara tu entorno de desarrollo en la nube. Se abrirá una interfaz de VS Code directamente en tu navegador. A la izquierda tendrás el explorador de archivos y en la parte inferior, una terminal.
Una vez que Codespaces se carga, VS Code es muy inteligente. Al detectar que trabajarás con Python, a menudo te sugerirá instalar la extensión oficial de Python de Microsoft. ¡Esta extensión es crucial y muy útil!
En la barra lateral izquierda, busca el icono de Extensiones (cuatro cuadrados, uno de ellos separado).
En el cuadro de búsqueda, escribe Python
.
Verás la extensión “Python” de Microsoft. Haz clic en el botón “Instalar” si aún no está instalada o si te aparece una notificación emergente que te lo sugiere (como se ve en la imagen que adjuntaste).
En el explorador de archivos de la izquierda, crea un nuevo
archivo llamado app.py
. Este será el archivo principal de
nuestra aplicación.
Crea otro archivo llamado requirements.txt
. Este
archivo es crucial, ya que le dice a Python qué paquetes externos
(librerías) necesita nuestro proyecto.
Dentro de requirements.txt
, escribe las dos
dependencias que usaremos:
streamlit
pandas
Ahora vamos a crear una “burbuja” aislada para nuestro proyecto para que las librerías que instalemos no interfieran con otros proyectos.
Crear el Entorno Virtual: En la terminal de
Codespaces (en la parte inferior), ejecuta el siguiente comando. Esto
creará una carpeta llamada .venv
que contendrá una
instalación de Python y pip específica para este proyecto.
python3 -m venv .venv
Activar el Entorno Virtual: Para empezar a usar la “burbuja”, necesitamos activarla. Ejecuta este comando:
source .venv/bin/activate
Notarás que el inicio de tu línea de comandos en la terminal ahora
tiene un (.venv)
al principio. ¡Esto significa que el
entorno virtual está activo!
Instalar las Dependencias: Ahora que estamos
dentro de nuestro entorno aislado, instalaremos streamlit
y
pandas
. Como ya las definimos en
requirements.txt
, podemos usar pip
para leer
ese archivo e instalar todo lo necesario.
pip install -r requirements.txt
Verás cómo se descargan e instalan los paquetes dentro de la
carpeta .venv
, manteniendo tu proyecto limpio y
autocontenido.
Nota para los alumnos: VS Code a veces te sugerirá crear el entorno virtual automáticamente con un clic. Si lo hace, ¡puedes hacer clic en “Crear”! Ambos métodos (manual y automático) logran lo mismo: un ambiente de trabajo ordenado y profesional.
app.py
Este es el paso principal. Iremos construyendo el código por partes.
Pega el siguiente código en tu archivo app.py
. Los
comentarios explican qué hace cada bloque.
# 1. Importar los módulos necesarios
import streamlit as st
import pandas as pd
import os # Este módulo nos ayudará a verificar si un archivo existe
# --- CONFIGURACIÓN DE LA PÁGINA ---
st.set_page_config(
page_title="Herramientas de Ingeniería",
page_icon="🛠️",
layout="wide"
)
# --- FUNCIONES PARA CADA ESPECIALIDAD ---
def calcular_concreto(largo, ancho, espesor):
"""Calcula el volumen de concreto en metros cúbicos."""
if largo > 0 and ancho > 0 and espesor > 0:
volumen = largo * ancho * espesor
return round(volumen, 2)
return None
def calcular_riego(area, lamina_riego):
"""Calcula el volumen de agua necesario para riego en metros cúbicos."""
if area > 0 and lamina_riego > 0:
# Convertir lámina de mm a metros (1 mm = 0.001 m)
volumen_agua = area * (lamina_riego / 1000)
return round(volumen_agua, 2)
return None
# --- ESTRUCTURA PRINCIPAL DE LA APLICACIÓN ---
# Título principal de la aplicación
st.title('🛠️ Herramienta de Apoyo para Ingeniería V1.0')
st.write("Una aplicación para asistir en tareas de Ingeniería Agrícola, Civil y Agroindustrial.")
# --- BARRA LATERAL (SIDEBAR) PARA NAVEGACIÓN ---
st.sidebar.header('Seleccione su Especialidad')
opcion = st.sidebar.radio(
'Menú de Navegación',
('Página Principal', 'Ingeniería Civil', 'Ingeniería Agrícola', 'Ingeniería Agroindustrial')
)
# --- LÓGICA PARA MOSTRAR LA PÁGINA SELECCIONADA ---
if opcion == 'Página Principal':
st.header('Bienvenido/a a la Caja de Herramientas Digital')
st.image('https://images.unsplash.com/photo-1581092921462-692004651e36?q=80&w=2070&auto=format&fit=crop',
caption='Ingeniería y Tecnología al servicio del desarrollo.')
st.markdown("""
Esta aplicación ha sido desarrollada para apoyar a los estudiantes de **Programación de Computadoras con Python**.
**Instrucciones:**
1. Utiliza el menú en la barra lateral izquierda para navegar entre las diferentes especialidades.
2. Ingresa los datos solicitados en cada sección.
3. Observa los resultados de los cálculos o el registro de la información.
¡Explora y aprende!
""")
# --- MÓDULO DE INGENIERÍA CIVIL ---
elif opcion == 'Ingeniería Civil':
st.header('Calculadora de Volumen de Concreto')
st.subheader('Para una losa rectangular')
col1, col2, col3 = st.columns(3)
with col1:
largo = st.number_input('Largo de la losa (metros)', min_value=0.1, value=5.0, step=0.1)
with col2:
ancho = st.number_input('Ancho de la losa (metros)', min_value=0.1, value=4.0, step=0.1)
with col3:
espesor = st.number_input('Espesor de la losa (metros)', min_value=0.05, value=0.15, step=0.01)
if st.button('Calcular Volumen'):
volumen = calcular_concreto(largo, ancho, espesor)
if volumen:
st.success(f'El volumen de concreto requerido es: **{volumen} m³**')
else:
st.error('Por favor, ingrese valores válidos y mayores a cero.')
# --- MÓDULO DE INGENIERÍA AGRÍCOLA ---
elif opcion == 'Ingeniería Agrícola':
st.header('Estimador de Necesidad de Riego')
st.subheader('Cálculo de volumen de agua')
area_cultivo = st.number_input('Área del cultivo (metros cuadrados)', min_value=1.0, value=1000.0, step=10.0)
lamina = st.number_input('Lámina de riego a aplicar (milímetros)', min_value=1.0, value=10.0, step=0.5)
if st.button('Calcular Agua Requerida'):
volumen_agua = calcular_riego(area_cultivo, lamina)
if volumen_agua:
st.success(f'El volumen de agua requerido es: **{volumen_agua} m³**')
else:
st.error('Por favor, ingrese valores válidos y mayores a cero.')
# --- MÓDULO DE INGENIERÍA AGROINDUSTRIAL ---
elif opcion == 'Ingeniería Agroindustrial':
st.header('Registro de Control de Calidad (pH)')
st.info("Esta sección guarda los datos en un archivo `control_calidad.csv`.")
# Usamos un formulario para agrupar los inputs y tener un solo botón de envío
with st.form(key='quality_form'):
id_lote = st.text_input('ID del Lote de Producción', 'LOTE-001')
valor_ph = st.number_input('Valor de pH medido', min_value=0.0, max_value=14.0, value=7.0, step=0.1)
submit_button = st.form_submit_button(label='Guardar Registro')
if submit_button:
# Crear un DataFrame con el nuevo dato
nuevo_registro = pd.DataFrame({'id_lote': [id_lote], 'ph': [valor_ph]})
# Nombre del archivo donde guardaremos los datos
archivo_csv = 'control_calidad.csv'
# Lógica para guardar el archivo
if os.path.exists(archivo_csv):
# Si el archivo ya existe, leemos los datos y añadimos el nuevo registro
df_existente = pd.read_csv(archivo_csv)
df_actualizado = pd.concat([df_existente, nuevo_registro], ignore_index=True)
else:
# Si el archivo no existe, el nuevo registro es nuestro DataFrame
df_actualizado = nuevo_registro
# Guardar el DataFrame actualizado en el archivo CSV
df_actualizado.to_csv(archivo_csv, index=False)
st.success(f"Registro para el lote **{id_lote}** guardado con éxito.")
# Mostrar la tabla con todos los registros guardados
st.subheader("Historial de Registros")
if os.path.exists('control_calidad.csv'):
df_registros = pd.read_csv('control_calidad.csv')
st.dataframe(df_registros)
else:
st.warning("Aún no se ha guardado ningún registro.")
Asegúrate de que tu entorno virtual esté activo
(deberías ver (.venv)
en la terminal). Si no lo está,
vuelve a ejecutar source .venv/bin/activate
.
Ejecuta el siguiente comando para poner en marcha tu aplicación Streamlit:
streamlit run app.py
Observa la notificación de Puerto Reenviado:
Después de ejecutar el comando, es muy probable que Codespaces detecte
que tu aplicación está escuchando en un puerto específico (Streamlit por
defecto usa el puerto 8501
, pero a veces puede usar otro
como 5018
si el 8501
ya está en uso).
Te aparecerá una notificación en la esquina inferior derecha de VS Code indicando algo como: “La aplicación que se ejecuta en el puerto XXXX está disponible.”
En esta notificación, haz clic en el botón “Open in
Browser”. * ¿Qué es el Reenvío de Puertos? En
Codespaces, tu aplicación se ejecuta en un servidor remoto. Para que tú
puedas verla en tu navegador local, Codespaces crea un “túnel” seguro
desde un puerto del servidor remoto (donde está tu aplicación, por
ejemplo, el 8501
) hasta un puerto de tu máquina local. Esto
se llama “reenvío de puertos” (Port Forwarding). Es como si tuvieras la
aplicación ejecutándose en tu propia computadora, pero en realidad está
en la nube. ¡Es una característica poderosa de los entornos de
desarrollo en la nube! 4. ¡Listo! Tu aplicación se abrirá en una nueva
pestaña del navegador. Interactúa con ella, prueba las diferentes
secciones y verifica que todo funcione.
Una vez que la aplicación funcione, es hora de guardar tu código en el repositorio.
app.py
,
requirements.txt
). Haz clic en el +
al lado de
cada archivo para “prepararlos” para el commit (esto se llama
staging)."Versión inicial de la aplicación de ingeniería"
..venv
): Son
carpetas aisladas que contienen una instalación de Python y las
librerías específicas para un proyecto. Esto previene el “caos de
dependencias” y asegura que el proyecto funcione igual en cualquier
máquina. Es la forma profesional de trabajar.requirements.txt
y pip
:
El archivo requirements.txt
lista las dependencias y
pip
es el gestor de paquetes que las instala.streamlit
,
pandas
): streamlit
nos permite crear
interfaces web interactivas con poco código Python, y
pandas
es fundamental para manejar datos en formato
tabular.if/elif/else
para controlar qué se muestra en la aplicación
según la interacción del usuario.os
: La
sección Agroindustrial introduce cómo guardar (.to_csv()
) y
leer (.read_csv()
) datos de un archivo, haciendo que la
información no se pierda al cerrar la aplicación. El módulo
os
ayuda a verificar si un archivo existe antes de intentar
leerlo.