Mostrando entradas con la etiqueta Presentación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Presentación. Mostrar todas las entradas

jueves, 20 de marzo de 2025

mav. Python


Biblioteca python-pptx




Esta biblioteca forma parte de un conjunto de recursos Python pensados para facilitar el trabajo con la suite ofimática MSO; concretamente con python-pptx podemos automatizar la creación de presentaciones Power Point.


Dada la versatilidad y compatibilidad de LibreOffice, es posible trabajar desde esta suite con cualquier documento creado para MSO, por lo que resulta que el uso de python-pptx también es compatible con la gestión de las presentaciones mediante LO-Impress.  Dicho esto para tranquilidad de los amantes del software libre, vamos a tratar en esta entrada sobre python-pptx como biblioteca.

Lo primero que deberemos hacer es importarla desde Símbolo de sistema mediante la instrucción pip install python-pptx; esto es necesario por no ser esta un biblioteca standard de Python.

Además tiene la peculiaridad de que, normalmente, y al contrario que en otras librerías, los script Python que hacen uso de ella no la llaman mediante la instrucción genérica (import python-pptx), aunque también puede hacerse así, sino mediante la llamada a cada una de sus funcionalidades específicas. Por ejemplo, para todo lo referentes (y nuclear) a la creación de una presentación se llama a las funciones Presentation() (from pptx import Presentation) y para trabajar con instrucciones que requieren dimensionar las formas que contienen las diapositivas (cosa que se hace en pulgadas), se llama a Inches (from pptx.util import Inches)

Por otro lado, al menos la creación de un modelo básico de presentación resulta ser bastante sencillo, lo que permite automatizar la creación de presentaciones Power Point de estas características, que se ajustan perfectamente a lo que necesitamos como alternativa a la creación de informes escritos para la presentación a colectivos de los resultados de evaluación grupal (también podría ser individual, pero generalmente es innecesario y no sustituye a la creación del informe sobre documento) o del análisis de datos. Evidentemente nada impide utilizar este recurso también para crear presentaciones específicamente informativas sobre un determinado tema, pero es este caso, si la presentación es larga y compleja, posiblemente automatizarla requiere adentrarse en el conocimiento de esta interesante biblioteca y sus múltiples opciones.

Para facilitarte esta tarea te dejo aquí enlaces a su fuente fundamental de información y a tres páginas con contenidos relevantes para la automatización de presentaciones:

MAV. Python


Python-pptx. Gráfico (3)




Gráfico estadístico

Tercer y último componente gráfico, el gráfico estadístico, al igual que la tabla, se puede presentar como imagen capturada creada con otro programa (una hoja de cálculo mismamente) o creada directamente. Esta es la opción que paso a explicar en esta última entrada sobre python-pptx.


Además, dada la diversidad de opciones disponibles, me limitaré a presentar tres de las opciones disponibles, quedando el resto a la decisión del usuario, que puede ampliar sus conocimientos sobre este particular desde este enlace.

Y por simplificar el contenido de la entrada omitiré la ya sabida (por ser la misma) explicación de la creación de la nueva diapositiva y todo lo que conlleva, para centrarme en lo que es específicamente crear el gráfico estadístico.

Este proceso implica añadir dos sentencias import al inicio del script...
  • from pptx.chart.data import CategoryChartData
  • from pptx.enum.chart import XL_CHART_TYPE
... cuyo significado resulta bastante explícito: la primera permite crear gráficos estadísticos y la segunda crear gráficos específicos según tipología.

Sobre esta base, en efecto, primero creamos el gráfico genérico (chart_data = CategoryChartData()), proceso que completamos asignando las categorías (chart_data.categories = ['Este', 'Oeste', 'Norte','Sur']) y las series de datos que va a tener nuestro gráfico (chart_data.add_series('Series  de datos', (0.40,0.35, 0.15, 0.10))), en este segundo caso mediante la función add_series() que requiere los siguientes parámetros: un título para la serie y la lista de datos de la serie (que debe ser acorde con el número de elementos de las categorías).

Después la añadimos el gráfico a la (teórica) colección de formas de la diapositiva mediante la función add.chart(). Esta función, cuya sintaxis completa incluye el identificador (variable) de la diapositiva y la referencia a la clase formas (Diapo6.shapes.add_chart()) requiere seis parámetros:
  • El primero, la clase de gráfico al que hace referencia la constante, en este caso, XL_CHART_TYPE.COLUMN_CLUSTERED, que hace referencia a un gráfico de barras.
  • Después cuatro variables numéricas, dos de posición y dos de dimensiones, que podemos introducir directamente o mediante referencia a variables declaradas previamente, como es el caso (x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5))
  • y finalmente la variable que remite al gráfico creado antes (en este caso, y como sabemos, chart_data)
La expresión final de esta instrucción es la siguiente: Diapo6.shapes.add_chart(
    XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data), aunque el cambio del tipo de gráfico podría hacer cambiar el primer parámetro (XL_CHART_TYPE.LINE para gráficos de línea o XL_CHART_TYPE.PIE para gráficos de tarta) o incluso la el conjunto del código explicado en esta entrada si así lo requiere el tipo de gráfico que deseamos emplear. No obstante, es posible que hacer gráficos más complejos mediante estos recursos no suponga una ventaja, siendo, en ese caso, más sencillo crear el gráfico mediante otro medio y simplemente cargarlo como imagen. Eso queda a la elección del usuario.

Documento. Accede desde este enlace al script con el que finaliza esta serie sobre automatización de presentaciones mediante python-pptx.

Gráficos. Python


Python-pptx. Gráfico
(2)





Tabla

Para las presentaciones que estamos pensando automatizar, las tablas son un componente gráfico interesante. Como gráfico podemos representarlas perfectamente mediante una captura de imagen, esto es, como una imagen simple, pero también es posible construirlas directamente basándonos en datos mediante python-pptx. Este será el tema de esta entrada.


Después de crear la nueva diapositiva (diapo5 = mi_presenta.slide_layouts[5]), de añadirla a la colección (diapo5 = mi_presenta.slides.add_slide(diapo5)) y de acceder a la colección de formas que contiene (formas = diapo5.shapes), esto por ser un modelo de diapositiva con título, y para poner título a la diapositiva (formas.title.text = 'Datos grupales básicos'), pasamos a trabajar con la tabla.

Aunque no es necesario, si resulta conveniente establecer a priori los valores de posicionamiento (x - y) y de  dimensiones de la tabla (cx - cy) (x, y, cx, cy = Inches(2), Inches(2), Inches(4), Inches(1.5)); después pasamos a crear la tabla propiamente dicha mediante la función add_table(), que consta de seis parámetros: dos de estructura de la tabla (filas-columnas), dos de posicionamiento y dos de dimensionado (tabla = formas.add_table(4, 3, x, y, cx, cy).table)

Tampoco es obligatorio, pero sí puede ser conveniente redimensionar las columnas para ajustarlas al contenido. Para ello utilizamos esta expresión ajusta a cada una de las columnas (aquí sólo reproduzco una: tabla.columns[0].width = Inches(2.5))

Ahora ya sólo nos queda escribir en las celdas su contenido: primero el nombre de las columnas (es este caso) (tabla.cell(0, 0).text = 'Estadístico') y después los valores (tabla.cell(1, 0).text = 'Media'). Recuerda que aquí únicamente presento aquí una muestra de cada una de estas instrucciones. Existen otras opciones de trabajo con tablas que puedes consultar en la web de la biblioteca, pero lo que se presenta en esta entrada (y en el script que la acompaña. Ver a continuación) tienes la información fundamental para trabajar con tablas sencillas, las que usarás con más frecuencia en tus presentaciones. 

Documento. En este acceso tienes el script que se explica en la entrada.


martes, 18 de marzo de 2025

MAV. Python


Python-pptx. Gráfico (1)






Imagen


Tras los textos, las imágenes son el componente más frecuente en una presentación informativa. Se trata generalmente de gráficos estáticos que simplemente son añadidos a la diapositiva por su función informativa y/o estética.


Los gráficos, y más en las presentaciones que aquí pretendemos automatizar, pueden reducirse en cuanto a tipología a imágenes externas que se incluyen en la presentación, pero también pueden especiales, como las tablas de datos y los gráficos estadísticos. En esta entrada trataré sobre el caso genérico, que podría ser suficiente para la mayoría de los casos, ya que tablas y gráficos se pueden convertir fácilmente en imágenes mediante el simple uso de la función captura de pantalla.

La inclusión de imágenes externas en una presentación es un proceso muy sencillo. Empieza accediendo a la imagen, bien mediante una dirección absoluta (img_path = 'D:/Aprendizaje.jpg' en el supuesto de la que imagen esté en el directorio raíz de la unidad D), bien relativa (img_path = 'Aprendizaje.jpg' cuando la imagen está en el mismo directorio que el script Python) y finaliza incluyendo la imagen en la diapositiva (pic = slide.shapes.add_picture(img_path, left, top)) mediante la función add_picture() que recibe tres parámetros:
  • el directorio donde se encuentra la imagen (variable asociada img_path)
  • y los posicionamientos cartesianos left y top bien como variables previamente asignadas (left = top = Inches(1)o bien mediante valores numéricos directos.
Recuerda que, al igual que con el text box, ese posicionamiento puede dar lugar a algunos problemas que habrá que solucionar probando los valores que mejor se ajusten a nuestras necesidades.

Entre ambos momentos, como es de esperar, está la creación de la diapositiva (también de tipo vacío, valor 6) (diapo4 = mi_presenta.slide_layouts[6])  y su añadido a la colección de diapositivas de la presentación (slide = mi_presenta.slides.add_slide(diapo4)).

Documento. Accede desde este enlace al nuevo script. También debes descargar esta imagen.


MAV. Python


Python-pptx (3)



Texto

Una vez creado el índice, entramos en la parte de la creación de la presentación en la que vamos dotando a ésta de contenido, y como ya dijimos, el contenido se va a concretar bien como contenido textual, bien como contenido gráfico. Vamos a tratar en esta entrada sobre cómo crear diapositivas con contenido textual.


Antes de empezar, deberemos importar dos utilidades de la biblioteca para que el script pueda acceder a las funciones necesarias (from pptx.util import Inches, Pt). Hecho esto, tenemos que crear una nueva diapositiva, que en este caso se ajusta al formato 6 (diapositiva vacía) (diapo3 =mi_presenta.slide_layouts[6]) y añadirla a la lista de diapositivas de la presentación (diapo3 = mi_presenta.slides.add_slide(diapo3)).

Viene a continuación un proceso no exento de cierta complicación: el dimensionado de lo que será el objeto text box (caja de texto), lo cual se realiza mediante una función (add_textbox()) que requiere cuatro parámetros numéricos, dos de posicionamiento (izquierda -left- y arriba -top- respecto a la diapositiva) y dos de dimensión (ancho -width- y alto -height- de la forma) todas ellas expresadas en pulgadas (1 pulgada = 2,54 cm), lo que hace que sea conveniente declarar previamente cuatro variables a las que asignar los valores respectivos (vg width = height = Inches(8)). Dado que ajuste del text box a la diapositiva es una cuestión de gustos, vas a tener que probar valores hasta que encuentres el que mejor se ajuste a tus necesidades, tarea esta que te puede llevar tiempo. Una vez que lo consigas puedes añadir la forma text box a la diapositiva (txBox = diapo3.shapes.add_textbox(left, top, width, height)) y definir la variable que te va  a permitir acceder a ella para escribir el contenido que desees (tf = txBox.text_frame)

Aunque no es prescriptivo, igual que te aconsejo trabajar con valores numéricos asociados a variables, también te aconsejo que utilices variables string para contener los textos que desees escribir; esto te facilitará la tarea siguiente (vg. titulo = "Los cuentos y los niños").

Y llega la hora de escribir el contenido en nuestro text box. Empezaremos por ponerle un título (tf.text = titulo), que no deja se ser un texto especial (por cómo es tratado y por la función que tiene) y paso seguido escribiremos el contenido, esto es, el párrafo o los párrafos que contendrá nuestro text box. Este proceso tiene dos fases:
  • Añadimos el párrafo al text box (p0 = tf.add_paragraph())
  • Y le damos contenido (p1.text = parrafo1)
  • Después podemos añadir formato al texto (p1.font.size = Pt(10)), aunque no siempre es necesario ni funciona como sería de esperar (eso también).
Cuando el texto (los párrafos) tiene una longitud que se ajusta al tamaño del text box y a la diapositiva como lienzo, no hace falta más ajustes; pero cuando la extensión del párrafo supera esas dimensiones se produce un efecto de desbordamiento que altera la visualización del contenido. En este caso es necesario llamar a una función que reajusta el texto al ancho del text box, generando automáticamente las líneas de texto necesarias, lo que evita que parte del texto que oculto. Esto es lo que hace la última línea de instrucciones de esta sección del script: tf.fit_text().

Documento: En este enlace puedes acceder al script que incluye el código explicado en esta entrada.


lunes, 17 de marzo de 2025

Gráficos. Python


Python-pptx. Índice.




Una vez que sabemos acceder a los objetos que componen una diapositiva, lo que nos ha servido para poner título a la presentación y añadir una breve explicación sobre el contenido, vamos a seguir aprendiendo a manejar otros componentes que normalmente forman parte de una presentación del tipo de las que nos interesa automatizar.


Para ello, siguiendo el listado de contenidos que expuse en la entrada precedente, vamos a tratar en ésta sobre el índice de la presentación. Este componente lo encontramos en el modelo 1 de diapositiva, el cual contiene un objeto título y un objeto de propósito general que nosotros, posteriormente utilizaremos para incluir nuestro índice. Para crear este modelo de diapositiva, primero la creamos del mismo modo que hicimos con la primera (diapo2 = mi_presenta.slide_layouts[1]), aunque especificando que será de tipo 1, y después a añadimos a la lista de objetos diapositivas del objeto presentación (diapo2 = mi_presenta.slides.add_slide(diapo2)). Como ves, se trata del mismo procedimiento que nos sirvió para crea la primera diapositiva y que nos servirá para crear las siguientes.

Una vez creada la diapositiva procedemos a poner el título, que será el mismo que pusimos en la primera diapositiva, aunque podría ser uno específico ("ÍNDICE", por ejemplo). En este caso el procedimiento que empleamos para poner el título en la diapositiva anterior lo vamos a desarrollar en dos fases, pero el resultado es el mismo, por lo que se trata simplemente de un procedimiento alternativo (bien podría ser como sigue: titulo2 = diapo2.shapes.title):
  • Primero accedemos a la clase formas de la clase diapositiva (formas = diapo2.shapes)
  • Y después a la forma title (título) presente en nuestra diapositiva en función del modelo (de diapositiva) que solicitamos crear en el paso anterior (titulo2 = formas.title)
  • Finalmente añadimos el texto (titulo2.text = "Presentación con python.")
Ahora estamos en disposición de entrar en materia, esto es, de escribir el índice que deseamos en la segunda forma, para lo que deberemos acceder a ella (esquema = formas.placeholders[1]) y después la conformamos como nos interesa (tesquema = esquema.text_frame), esto es, como un text_frame, ya que inicialmente se trata de un contenedor de tipo general (placeholders). Observa que hemos utilizado la variable formas que dotamos de contenido antes, dando ahora sentido al procedimiento explicado.

Aunque en nuestra presentación hemos optado por incluir contenido del nivel superior (tesquema.text = "Índice de contenidos."), podemos prescindir de ello, según el modo en que pensemos redactar el índice. Por ejemplo podemos hacer que el título principal de la diapositiva sea "ÍNDICE" y el índice propiamente dicho no tenga título, ocupando los epígrafes principales ese nivel. Te animo a que investigues esta opción.

Dejando pendiente esta cuestión, vamos a ver cómo incluimos los contenidos del esquema y cómo identificamos el nivel al que pertenece. Para ello tomaré como ejemplo el primer componente, ya que el resto se resuelve por repetición del procedimiento.
  1. Añadimos el parágrafo a la lista del conjunto de objetos parafraph (p1 = tesquema.add_paragraph())
  2. Dotamos de contenido textual a ese elemento (p1.text = "Título y subtítulo")
  3. Y finalmente indicamos el nivel al que pertenece (p1.level = 1), que en este caso es el primer nivel, pero que en otros, como el asignado a la variable p4a es el segundo (p4a.level = 2)
La repetición de este procedimiento nos permite crear, de forma sencilla, el índice de la presentación. Dado que se trata de una mera repetición de las mismas instrucciones, no es difícil simplificar el procedimiento mediante el uso de listas y bucles, pero de momento es incluso preferible que lo hagamos de forma repetitiva para asegurarnos el dominio de dicho procedimiento.

Documento. En este enlace puedes acceder al script que incluye el código explicado en esta entrada. Incluyo una modificación de la estructura del script para mejorar la diferenciación de sus partes.

domingo, 16 de marzo de 2025

MAV. Python


Python-pptx. Título y subtítulo.




Como dije en la entrada anterior, dedicaré una serie de entradas a explicar el uso de la librería python-pptx para automatizar la creación de diapositivas Power Point. Pero antes de exponer estos procedimientos, me parece de interés concretar los contenidos mínimos que podemos pedirle a una presentación automatizada, ya que, de no ser así no es de extrañar que nos podamos perder ante el inmenso abanico de posibilidades que están a nuestra disposición; muchas de las cuales no nos aportan gran cosa en lo que hace referencia a nuestros objetivos, que son bastante modestos, en realidad.


Definir adecuadamente nuestro propósito es un punto de partida necesario, así que no es redundancia repetir aquí lo que ya enunciamos en otro momento: las presentaciones que tratamos de automatizar se identifican como tales por partida doble: por el soporte en el que se desarrollan y por el objetivo que cumplen (se trata de soportes "presentación" para la presentación de información). Lo segundo delimita claramente qué sí y qué no vamos a hacer (ni ejercicios, ni cualquier tipo de animación gráfica, ni juegos) ; lo primero es obvio, pero también tiene ciertas implicaciones, como la de que para crear otro tipo de documentos de aprendizaje mediante python, deberemos recurrir a otros medios (python-pptx no nos sirve para esos otros fines).

Y una presentación que trata de informar sobre una evaluación grupal o del resultado del análisis de unos datos debe contar con un mínimo de recursos en términos de servicio-soporte:
  1. Un título informativo
  2. Un índice
  3. Un contenido textual
  4. Y un contenido gráfico.
Únicamente cabe la posibilidad de establecer diferentes tipos de elementos gráficos, en función de la disponibilidad que ofrece python-pptx, ya que sería suficiente con un tipo gráfico genérico (soporte imagen), pero ya que es posible, puede ser interesante diferenciar entre la imagen, la tabla de datos y el gráfico estadístico; resulta que, además, los tres son de especial utilidad para nuestros fines.

Es cierto que otros tipos de presentaciones informativas pueden requerir otros componentes, pero con los indicados en nuestra lista es posible crear ese tipo de documentos, siempre y cuando no aspiremos a un amplio despliegue de transiciones y transformaciones, claro está; aunque personalmente considero que, salvo que busquemos objetivos específicos (como una demostración, por ejemplo), esos "dinamismos" tienen más inconvenientes que ventajas, siendo el principal de ellos el convertirse en fines en si mismos.

Dicho esto, para empezar la senda que nos hemos marcado, bueno será que empecemos por el principio: cómo crear una diapositiva que contenga el título de la presentación y una breve información complementaria. Para ello partiré del script creado en la entrada anterior, procedimiento que seguiré en las sucesivas hasta completar el proceso que se describe anteriormente.

En primer lugar, el tipo o patrón de diapositiva que creamos (diapo1 = mi_presenta.slide_layouts[0]) (en negrita) responde al tipo deseado, ya que contiene dos objetos: el título y el subtítulo, así que pasamos a trabajar con cada uno de ellos:
  • Para el título, accedemos a la forma (titulo = diapo1.sahpes.title) y le añadimos el texto (titulo.text = "Presentación con Python")
  • Y para el subtítulo, poco más o menos lo mismos:
    • Accedemos al objeto (subtitulo = slide.placeholders[1])
    • Y añadimos su contenido textual (subtitulo.text = "Elementos básicos de una presentación informativa.")
Como has podido ver, resulta sumamente sencillo acceder a los objetos que componen una diapositiva, tanto como crear la presentación y la propia diapositiva, siendo esta la principal ventaja de trabajar con python-pptx (en relación a hacerlo con OOo Basic).

Documento. En este enlace puedes acceder al script Python completo y actualizado, en realidad el segundo de esta serie.

Nota. Observa que en ambos script he establecido como dirección para guardar la presentación el directorio raíz de la unidad D. Si prefieres otra ubicación, deberás modificar esta línea de código.

jueves, 17 de octubre de 2024

Presentación

OrientAsLO y la competencia digital de los SEO

Después de varios intentos y formulaciones del mismo (este mismo) proyecto, llego a su cuarta versión habiendo recorrido un camino nada despreciable en producción y aprendizaje, aunque (reconozco) no siempre satisfactorio (de ahí lo de las diferentes versiones), manteniendo, eso sí y en lo fundamental, el mismo objetivo: contribuir al desarrollo de la competencia digital de los componentes de los Servicios de Orientación (SEO).

Estoy convencido de que nunca el tiempo es perdido (como dice el poeta), y no como consuelo (quiero creer), sino como resultado de un proceso personal de aprendizaje que sólo las experiencias pasadas han podido hacer posible.

Desde el inicio de este proyecto y hasta el momento actual, han transcurrido ya cuatro años, iniciándose en 2021, muchas entradas y algunos cambios en la forma y la estructuración del contenido.

De todo ello quedan huellas en la actual formulación que mantiene y se basa  en esa historia de tentativas, de modo que la versión actual del blog debe mucho a las anteriores, lo que se manifiesta en los contenidos publicados y en el aprendizaje que implican.

El recorrido realizado, ya en sus primeras formulaciones, se inicia profundizando en las posibilidades de la suite ofimática LibreOffice y muy especialmente en las que ofrece el uso del lenguaje OOo Basic. El mantenimiento del nombre original del blog es un reconocimiento y un tributo tanto a la propia suite y su lenguaje de base, como a esos mismos orígenes.

Mantengo parte del trabajo resultante de esos inicios por considerar que siguen siendo de interés, pero sobre todo porque permanece invariable el análisis de la situación y el objetivo principal que originó esta propuesta: los SEO necesitan una formulación específica de competencia digital, teniendo en ella un espacio propio el conocimiento de lo que puede aportar la ofimática y, dentro de ella, la generación de soportes basados en lenguajes de script, lo que equivale a decir el conocimiento aplicado de la lógica de programación. A esto quiere contribuir este blog.

Partí en los inicios de este proyecto de la constatación de limitaciones en el uso real de medios informáticos por parte de los SEO, pero también de lo insatisfactorio de los planteamiento inespecíficos en la definición de la competencia digital docente por parte de la Administración educativa. 

Respecto a este planteamiento mantengo que es radicalmente insatisfactorio, ya que no tiene en cuenta las especificidades de las necesidades de los SEO. No se explica de otra manera la ausencia de referencia específica a estos servicios ni el olvido de la competencia ofimática como componente principal de su competencia digital.

Además de este "olvido" considero que hay otro que también afecta al conjunto de profesorado: considerar "competencia genérica" el conocimiento de la lógica de programación y mantener la competencia digital docente ajena al pensamiento computacional es un doble error. Por un lado conlleva, en buena lógica y así se confirma, considerar al docente básicamente como un consumidor-usuario de recursos (las hoy llamadas "herramientas de autor"), olvidando la capacidad del docente para crear recursos al margen de lo que proporcionan estas herramientas (1); por otro lado esta consideración resulta contradictoria con la exigencia que se hace al profesorado de ser el facilitador del desarrollo del pensamiento computacional en el alumnado.

Creer que el profesorado dispone de conocimientos y habilidades de pensamiento computacional por haberlas aprendido "genéricamente" resulta, cuanto menos, ajeno a la realidad. Por el contrario, el pensamiento computacional o es aprendido en procesos específicos de formación o su enseñanza (a los alumnos) se tendrá que dejar en manos de especialistas, los profesores de informática, quienes no la han adquirido precisamente por ciencia infusa ni por la mera práctica.

Volviendo a la especificidad de la competencia digital de los SEO, mantenerlos al margen de la lógica de programación acentúa especialmente su condición de meros usuarios, impidiendo que sus componentes sean competentes para generar soluciones que respondan a sus necesidades profesionales. Y dado que este colectivo, por minoritario, no resulta rentable para la industria del software, no cabe esperar que ésta provea de esas soluciones específicas. El resultado es tan previsible como evitable desde otra definición de su competencia digital específica.

Cuanto más competente mejor, evidentemente, pero tampoco es necesario establecer niveles de exigencia elevados. Para obtener resultados tangibles y funcionales es suficiente con incluir en su definición específica de competencia digital los conocimientos necesarios de ofimática creativa.

Entiendo por competencia ofimática creativa un nivel de conocimientos teórico-prácticos (fundamentalmente del segundo tipo) que habilitan al profesional para generar soportes (documentos) basados en los propios servicios ofimáticos incorporando script que faciliten la (semi)automatización de los procesos (2).

Con es nivel como mínimo competencia no estoy estableciendo su techo, pero como primera meta resultaría satisfactoria. A partir de ahí se pueden plantear otras que ahora parecen alejadas de lo posible, pero que en su momento se pueden incorporar como parte de las herramientas que faciliten la práctica profesional. Con ello me refiero, por ejemplo, a tecnologías orientadas al análisis de los datos resultantes de las actuaciones de los SEO. En la medida en que la hoja de cálculo sea o se convierta en herramienta habitual de registro de datos y el análisis de los mismos una práctica frecuente (para el análisis de las actuaciones, por ejemplo), contar con conocimientos informáticos aplicables a estos procedimientos se convertirá en una necesidad.

Pues bien, este blog mantiene su objetivo inicial de contribuir al desarrollo de lo específico la competencia digital de los SEO, incorporando recursos para el desarrollo de la lógica de programación y el conocimiento básico de un sencillo lenguaje de programación (OOo Basic). Conocimiento sistemático de tipo teórico-práctico, no un mero recetario de trucos, pero con claro predominio de esa dimensión práctica que incluye formas de uso, procedimientos de implementación, desarrollo de estrategias de trabajo y propuestas de solución práctica. 


NOTAS

(1) No deja de ser revelador al respecto el cambio de denominación que han sufrido estos recursos. Se ha pasado de la denominación lenguajes de autor a herramientas de autor. Este cambio de denominación no es gratuito, ya que conlleva también un cambio de orientación: de basarse en lenguajes de script a ser utilidades que facilitan la generación automática de materiales de aprendizaje y evaluación prêt-à-porter. La aplicación de utilidades IA refuerza aun más esta orientación.
(2) Que no está reñido con el uso de soluciones de terceros, libres o comerciales, ni con la incorporación de recursos basados en la IA.


martes, 9 de julio de 2024

MAV. OOo Basic


Uso de imágenes en Calc como comandos.




Aunque pensada para el trabajo de datos cuantitativos, Calc también admite el uso de imágenes. Además es posible convertir estas imágenes en comandos (botones) asociados a script. Esto permite usar Calc como recurso interactivo de  evaluación aprendizaje.


En esta entrada mostraré diferentes opciones de imagen convertida en comando. Las posibilidades que se derivan de esto son múltiples, ya que Calc conserva toda su funcionalidad de cálculo, de implementación de imágenes y de análisis de datos.

Podemos trabajar con tres tipos de imágenes en Calc: las formas (Insertar | Forma, seleccionándolas dentro de las disponibles en los distintos grupos), las imágenes (Insertar | Imagen, seleccionado una imagen de una carpeta de nuestro ordenador) y los botones con imágenes (Ver | Barra de herramientas | Controles de formulario | Botón con imagen, seleccionando después la imagen desde Propiedades del control | Imagen



Las dos primeras (forma e imagen) pueden asociarse a un script accediendo al objeto (clic derecho) seleccionando la opción Asignar macro dentro de las que se nos ofrecen en el menú emergente.


Desde Asignar macro podremos seleccionar el script que deseemos vincular con la imagen...


... seleccionándolo desde la ventana Macro de y activando la siguiente secuencia de comandos: botón Asignar -> Aceptar.

Para asociar un script al Botón con imagen seguiremos los mismos pasos que con un botón de comando normal, pero no disponemos de algunas de las opciones que sí tiene éste, así que podemos optar por otra cuyo funcionamiento sea similar (1)

El contenido de los script está determinado por el objetivo que persigas con él; en este ejemplo simplemente escriben en una celda una frase que informa de lo que se muestra en la imagen.

Otra manera con la que podemos trabajar, en este caso con las formas, es superponiéndolas sobre una imagen de fondo. Antes de modificar la transparencia (Clic derecho sobre la forma y selección de la opción Área) es conveniente asociarlas a un script, siguiendo el procedimiento explicado antes (2). El resultado es muy interesante: disponemos de una imagen compleja interactiva (gracias a esas formas-comando), como puedes ver en Hoja2 (3). Estoy convencido que ya sabes qué partido puedes sacar de esta opción de trabajo.


NOTAS

(1) En este caso opté por Botón del ratón pulsado, pero puedes optar por cualquier otro evento, el que más se ajuste al modo de funcionar que te interese.
(2) De no hacerlo en este momento nos resultará difícil activar las opciones de formato, por lo que no podremos acceder al menú de asignación de macro.
(3) En ella te presento un dibujo de un paisaje (images.app). Sobre tres de los elementos de este dibujo he situado tres formas (se muestran en tres niveles diferentes de transparencia) a los que se han asociado tres script. Al activarlos se muestra un sencillo texto explicativo en la celda  M4.

jueves, 27 de junio de 2024

MAV. OOo Basic


Creación de ítem de evaluación con Impress





También en Impress (servicio de creación de presentaciones de LibreOffice) es posible crear ítem de evaluación, y no me refiero al uso básico de las presentaciones como recurso para presentar la tarea, algo que ya [hemos visto] en este blog como soporte complementario de un docap. También hemos hablado de las peculiaridades del uso de  OOo Basic en Impress, por lo que [te remito a estas entradas] sobre estas cuestiones previas.


Lo que voy a tratar ahora es el proceso a seguir para transformar una diapositiva Impress en un recurso de evaluación. Se trata de una mera ilustración del modo de trabajo, en realidad de uno de los modos de trabajo, y en su forma más simple. La incorporación de recursos gráficos como los que proporciona Impress dentro de un docap complejo, requiere un desarrollo del contenido de esta entrada que posiblemente abordaré en otro momento.

Para contextualizar esta exposición, vamos a suponer una prueba de evaluación de un único ítem creado sobre presentación Impress, la cual diseñaremos para que el alumno responda directamente actuando sobre la pantalla. Se trata de que el funcionamiento del documento permita el uso directo por parte del alumno, aunque no resuelve todos los problemas que esto implica, sólo los más básicos.

Ya sabemos que Impress permite también (como todos los servicios LibreOffice) el uso de script (1), pero con ciertas limitaciones, incluyendo una determinante: no es posible utilizar la funcionalidad Grabar macro. También presenta ciertas peculiaridades que responden a los dos modos de trabajo con el servicio: en modo Diseño y en modo Presentación.
  • En modo Diseño podemos implementar controles de formulario, por ejemplo botones de comando, que asociados a script funcionan como se espera.
  • Pero algunos de esos controles, por ejemplo los citados botones de comando, no funcionan como desearíamos en el modo Presentación (2).
Estas limitaciones las podemos suplir implementando diálogos, pero también transformando los elementos gráficos en comandos, asociándolos a script. Esta será nuestra opción ahora. Paso a explicarte en detalle cómo hacerlo.

Te presento nuestra "presentación". Se trata de un ítem [tomando como modelo el test RIAS-MnV] que nos servirá de base para este trabajo.



Seguro que reconoces en este nuestro ejemplo el formato de presentación de los ítem del test, con lo que te será fácil trasladarte mentalmente a sus cuadernos de trabajo. Como puedes ver, nuestro ejemplo consta únicamente de dos diapositivas, aunque en un desarrollo real sería necesario repetir el mismo modelo tantas veces como ítem tiene la prueba: la primero contiene el estímulo y la segunda las opciones de respuesta. Utilizo la forma Flecha (Insertar | Forma | Flechas de bloques) para el desplazamiento por la presentación, si bien se podría utilizar el paso de diapositiva en función de un intervalo de tiempo (3)

Puedes comprobar que es posible implementar botones de comando [Ver | Barra de herramientas | Controles de formularioy también su correcto funcionamiento en el modo Diseño, (una vez que lo asocies a un script), pero cuando trates de activarlos desde el modo Presentación observarás que no funciona.

Después de hacer esta prueba (4), y antes de implementar nuestro "botones", deberemos habilitar nuestra presentación para que contenga script. Para ello procedemos como en el resto de los servicios LibreOffice:

Herramientas | Macros | Organizar macros | BASIC | Organizador ....

... para crear el módulo (o los módulos) en el que escribiremos nuestros script. Te recomiendo escribir estos antes de implementar los comandos, así que aquí tienes los que yo planteo:

Dim mRespuestas(43) As String
Dim mPuntos(43) As Integer

Sub cmd11

mRespuestas(0) = "A"
mPuntos(0) = 2

Info
End Sub

Sub cmd12

mRespuestas(0) = "B"
mPuntos(0) = 0

Info
End Sub

Sub cmd13

mRespuestas(0) = "C"
mPuntos(0) = 0

Info
End Sub

Sub cmd14

mRespuestas(0) = "D"
mPuntos(0) = 0

Info
End Sub

Sub cmd15

mRespuestas(0) = "E"
mPuntos(0) = 0

Info
End Sub

Sub cmd16

mRespuestas(0) = "F"
mPuntos(0) = 0

Info
End Sub

Sub Info
MsgBox "Respuesta: " & mRespuestas(0)
MsgBox "Puntuación " & mPuntos(0)
End Sub
 
A destacar:
  • Las matrices que contienen las respuestas (mRespuestas(43) - mPuntos(43) (5)) se declaran como públicas, fuera de los script, para que sean accesibles desde todos ellos.
  • Creo tantos script como botones necesito implementar en la diapositiva de respuesta (contiene 6 opciones), todos ellos con la misma estructura, por lo que el procedimiento, aunque parece costoso, en realidad es muy simple: asignación al primer elemento de cada una de las dos matrices un contenido. En el de la matriz mRespuestas(0) se asignará una letra que corresponde con la opción seleccionada, y en el de la matriz mPuntos(0), obviamente la puntuación (1 para la opción A y 0 para el resto).
Queda claro que no es un código precisamente muy elaborado, lo admito, pero en esta entrada de lo que se trata es de ver cómo podemos implementar controles de formulario (o similares) para asociarlos a OOo Basic y hacer que una presentación funcione como docap, así que, de momento, no nos detendremos en el código para centrar la atención sobre los procedimientos de acceso y la forma de implementar controles funcionales en la presentación. De eso va la parte que sigue de esta entrada.

Dado que el funcionamiento de los controles de formulario parece que no son de mucha ayuda (en el modo Presentación, que es el que nos interesa) (6), tendremos que buscar una alternativa. Afortunadamente la hay, y se llama uso de las formas básicas y su asociación a macros (script), posibilidad esta prevista LO-Impress como funcionalidad dentro de las opciones de funcionamiento que se asignan a esos objetos. Veamos cómo hacerlo.

En primer lugar tenemos que considerar dos posibles situaciones, ya que la forma de trabajo dependerá de con cual de las dos situaciones nos encontremos:
  • Que en la diapositiva de respuestas cada imagen sea un elemento diferente. En ese caso, nuestro caso tendíamos un total de seis elementos.
  • O que se trate de un dibujo único (una lámina con seis dibujos). Ahora sólo habrá un único elemento (7).
En el primer caso, directamente podremos convertir cada uno de los elementos en un comando que se asocia con un script. Para ello seguiremos estos pasos:
    1.  Seleccionamos el objeto-dibujo.
    2. Clic derecho sobre el objeto seleccionado
    3. En el menú de opciones que se despliega seleccionamos Interacción
    4. Activamos el desplegable de opciones (Acción al pulsar sobre el ratón)
    5. Y seleccionamos la opción Ejecutar macro
  • Una vez que aceptamos esta selección (botón inferior Aceptar) aparece un TextBox (Macro) que nos facilita acceder a IDE haciendo clic en el botón de comando Examinar.
  •  LO que tenemos que hacer a continuación es lo mismo que hacemos cuando queremos vincular un botón de comando a un script: seleccionar el directorio donde se encuentra el script, en caso de que el que se nos muestra no sea el que nos interesa (que normalmente lo será, con lo que nos ahorraremos este paso)
  •  Y hacer clic sobre el script que nos interese.

De este modo tan simple hemos convertido una imagen (o una forma Impress) en un comando que activa un script. Al contrario de lo que sucede con el control Botón de comando de formulario, nuestra imagen-comando no funciona como tal en el modo Diseño, pero sí en el modo Presentación, y la primera muestra de ello es que cuando pasamos el ratón por la imagen-comando, el puntero cambia de forma (Flecha -> Mano) y si hacemos clic sobre ella se desarrollará la secuencia de acciones que está diseñada en el script asociado.

Cuando se trata de una lámina con varias imágenes, tenemos que cambiar de estrategia, ya que ahora no existe un objeto individualizado sobre el que actuar; por eso deberemos utilizar las formas disponibles en Impress  (por ejemplo (8)), pero el proceso a seguir para transformar esas formas en comandos sigue siendo el mismo de antes.

Ahora bien, para resolver esta segunda situación (lámina única) tenemos dos opciones de configurar la presentación:

  • Crear una forma-comando añadida a cada elemento de la imagen, como es el caso de la imagen que te muestro a continuación, en la que bajo cada figura he situado una forma (pequeño círculo rojo), la cual transformo en comando siguiendo el método explicado antes...

  • O superponer a cada imagen de la lámina una forma transparente, siendo ésta la que se convierta en comando (siguiendo el mismo procedimiento. En este caso no se observa aparentemente nada diferente de lo que es la propia lámina, pero cada una de sus imágenes aparentemente se ha convertido en un comando; en realidad es la forma superpuesta la que actúa como comando, pero al ser transparente no se aprecia.

Veamos como proceder para desarrollar esta posibilidad:

  • Seleccionamos la figura que vamos a superponer a cada uno de los dibujos de la lámina, de modo que lo cubra por completo.
  • Seleccionamos y copiamos esta figura y la desplazamos hasta la imagen siguiente, así hasta cubrir todos las imágenes (o todas las que deseemos (9))
  • Ahora puedes convertir cada figura en comando, siguiendo el procedimiento ya explicado (10)
  • A continuación te recomiendo modificar la línea exterior de todas esas formar para hacer que desaparezca. Para ello, con la forma seleccionada hacemos clic derecho y en el menú desplegable elegimos la opción Línea y como estilo Ninguno.

  • Ahora es el momento de trabajar de nuevo con cada figura, pero no ya con la línea, sino con el Área 


... y dentro de las opciones posibles, con Transparencia, seleccionando la segunda opción (Con transparencia) y como valor el 100%.


La imagen que sigue muestra diferentes grados de transparencia para que aprecies mejor el proceso, aunque el objetivo final es que todas se presenten igual que la primera, sin línea exterior y totalmente transparentes.


De este modo, la imagen de la lámina queda a la vista, la figura superpuesta es invisible y el comando funciona sin problemas en el modo Presentación.  El usuario tendrá la sensación de hacer clic sobre el dibujo de su elección igual que si trabajáramos con imágenes individuales.

Documento

Desde [este enlace] puedes descargar la presentación que nos ha servido de ejemplo. Consta de cuatro diapositivas, el estímulo y tres más de respuesta, una con cada una de las opciones de trabajo he henos visto. 

Debes descargar el archivo, abrirlo desde LibreOffice y como se trata de un archivo con macros, habilitarlas.

El código que contiene es el mismo que te muestro en la entrada, pero te sugiero que accedas a él desde el IDE y que introduzcas los cambios y mejoras que te parezcan oportunos.

NOTAS

(1) En este momento nos limitamos al uso de OOo Basic como lenguaje de programación, pero ya sabes que en LibreOffice hay otras opciones, incluyendo Python.
(2) Otros controles se pueden implementar en el modo diseño, pero no funcionan ni en este modo ni en el modo presentación. Además, el funcionamiento de la presentación depende del modo en que ésta esté configurada. Todas estas cuestiones no serán tratadas en esta entrada, salvo lo que resulte de inmediato interés.
(3) En RIAS-MnV se plantean tiempos de presentación del estímulo (5") y de máximo de exposición de la lámina de respuesta: 20" en primera instancia y, en caso de fallo, 10" más. Estos requisitos se ajustan bien al uso de intervalos de tiempo como criterio de paso de las diapositivas; pero aquí asumo que es el profesional quien controla los tiempos de exposición, lo que, aunque es factible con un único monitor, se beneficia del uso de dos: el primero es controlado por el OE y en el segundo se muestra la presentación al alumno.
(4) No es obligatoria, ya te he contado yo lo que sucede, pero tampoco está de más comprobarlo personalmente.
(5) Su dimensión (43) se explica por contener RIAS-MnV 44 ítem.
(6) No puedo descartar que esto sea debido a muy escaso conocimiento del servicio Impress, pero en todo caso sí está claro que el comportamiento de los controles de formulario no es tan funcional y sencillo como en Calc o en Writer, lo que genera problemas que, hoy por hoy, no estoy en condiciones de resolver. De ahí la necesidad de trabajar desde otra perspectiva.
(7) También podemos importar imágenes si consideramos que se ajustan mejor a lo que nos interesa.
(8) Aunque según qué casos, ésta puede ser una solución menos "elegante" que presentar cada imagen de forma independiente, la lámina única ahorra mucho trabajo de preparación de materiales e incluso puede ser la mejor opción según para qué tareas, como la de localizar determinados elementos en un mapa, fotografía o dibujo.
(9) Para un soporte de evaluación como el que estamos creando es necesario que todas la posibles respuestas estén cubiertas por este tipo de comandos, ya que todas son opciones de respuesta. En otros casos se deberá valorar lo que resulta más fiable y conveniente, ya que, como dije, en el modo Presentación el cursor cambia de forma, lo que es una pista de cuáles son las imágenes que están asociadas a script.
(10) Aunque puedes convertir cada figura en comando cuando lo desees, yo te recomiendo que lo hagas bien en este momento o, como mucho, tras el siguiente (eliminar la línea externa de la forma), pero siempre antes de trabajar con la transparencia de la figura. De este modo te ahorras problemas para seleccionarla, ya que una vez que es transparente te va a costar que se active para convertirla en comando.  Cierto que puedes utilizar un truco, como seleccionar la lámina de fondo y desplazarla para que las figuras transparentes queden identificadas, pero tendrás que volver a colocar de nuevo la lámina en su sitio exacto sin poder ver cómo queda la superposición lámina-figuras, lo que no siempre es fácil.