lunes, 17 de junio de 2019

LECTOR (POR AUDIO) DE FICHEROS DE TEXTO CON "win32com" EN PYTHON.

En el presente artículo, vamos a crear un sencillo programa que sea capaz de leer (mediante salida de audio) el contenido de un fichero de texto (de extensión ".txt") que nosotros, previamente le indiquemos.

Para la cofección de nuestro programa, vamos a hacer uso de la librería para "Windows", "win32com". Puesto que lo que queremos es generar una salida de audio, lo primero que haremos será importar la referida librería del modo que ya conocemos:

lt1
Para aquellos que aún no tengáis instalada esta librería, tendréis que instalar "pywin32" o "pypwin32" haciendo uso del módulo "pip".

iiii.png

En realidad, este es el único recurso externo que vamos a emplear en la confección de nuestro programa. Por lo cual, pasaremos a definir una función (de nombre "conti", relacionada con la introducción de opciones) cuya razón de ser explicaremos en su momento:

lt1

Tras ello, empezaremos a preparar nuestro programa para que sea capaz de generar audio a partir de texto escrito con "win32com". Esto lo haremos creando el objeto "speak" que se encargará de llevar a cabo tal acción. Como se ve en la imagen, eso lo haremos escribiendo "speak=wc.Dispatch("Sapi.SpVoice")":

lt2

Con lo visto hasta ahora, nuestro programa ya está listo para generar audio a partir de texto. En las líneas siguientes lo que haremos será indicarle la información que queremos que "lea". Para ello, lo que haremos será pedir a nuestro hipotético usuario, que introduzca el nombre (sin la extensión, la cual, añadiremos nosotros mismos al input) del fichero de texto que desea que nuestro programa reproduzca. Dicha información se almacenará en una variable a la que hemos dado el nombre de "texto":

lt3

Una vez declarada la variable "texto" nuestro programa, lo primero que tendrá que hacer es abrir dicho fichero. No obstante, existe la posibilidad que (por algún error a la hora de introducir el nombre del fichero) nuestro programa no pueda abrirlo al no encontrarlo. Dicha situación tendrá que ser prevista de algún modo. Para ello utilizaremos una sentencia "try" mediante le indicamos a nuestro programa que "intente" la apertura de dicho archivo, de modo que si no puede completar esta operación ("except: ") nos muestre el correspondiente mensaje de error:

lt4

De este modo, hacemos que para el caso de no poderse abrir el fichero pedido (por estar mal escrito o no encontrarse ubicado en el lugar correcto), el programa nos muestre un mensaje advirtiendo al usuario de que dicho archivo no ha sido encontrado, y dando a su vez, la posibilidad de continuar o finalizar el programa (para lo cual el usuario tendrá que introducir "n" o "s" de acuerdo a la información requerida por la función "conti", a la que me referí con anterioridad).

Animated GIF-downsized_large (3)

Bien, una vez que tenemos previsto como ha de actuar nuestro programa para el caso que no encuentre el fichero pedido por el usuario, pasaremos a programar el supuesto en el que el programa si pueda encontrar y abrir dicho fichero. En tal caso, lo que nuestro código ha de hacer es proceder a la lectura de dicho fichero, leyéndolo línea a línea. Para ello emplearemos el método que, en su momento vimos en la serie dedicada a la gestión de ficheros de texto con python (a la que me remito al final). De tal modo, que para recorrer las líneas que compongan el archivo ".txt", escribiremos:

lt5

Como se ve, lo que estamos haciendo es usar un ciclo "for" que irá recorriendo las lineas de las que se compone el texto a leer, tal y como vimos en su momento cuando hablábamos de ficheros de texto. En aquella ocasión para cada lectura de línea, imprimíamos su contenido (mediante la sentencia "print"). No obstante, en este caso lo que queremos es generar un audio que recite el contenido de la misma. Por ello, en este caso, donde antes usábamos "print", haremos una llamada a la variable "speak" que, tal y como veíamos anteriormente, era la que contenía el objeto que producía la salida de audio:

lt6

De ese modo, el programa aplicara la función ".Speak" al contenido de la variable "linea" (el cual, se corresponde con el texto contenido en cada una de las líneas de texto que componen el archivo ".txt").

Así, si le pedimos a nuestro programa que reproduzca (por audio) el contenido de un archivo de nombre, por ejemplo, "new york.txt", que se encuentre ubicado en nuestra carpeta python, se procederá a leer, línea a línea, dicho archivo (mediante salida de audio).

EJECUCIÓN EN CONSOLA DURANTE LA LECTURA DE UN ARCHIVO
Animated GIF-downsized_large (2)

En lo referente a la lectura del archivo, cabe hacer referencia al hecho de que la pronunciación que tenga el audio, viene determinada por el idioma que venga establecido como predeterminado en el sistema operativo "windows" del que se trate. esto es importante tenerlo en cuenta, debido a que si hacemos que nuestro programa lea un texto en español, siendo el idioma preestablecido el, por ejemplo, inglés, la lectura del mismo, no producirá ningún error, pero si que sonará bastante raro.

lt
Como puede apreciarse en el código sobre estas líneas, una vez finalizada la lectura del fichero de texto, daremos al usuario la posibilidad de continuar o finalizar la ejecución del programa, haciendo uso de la función "conti" que ya definimos al comienzo.

Animated GIF-downsized_large (5)

Podéis ver el código completo del este programa en el siguiente enlace de github:
https://github.com/antonioam82/text-reader/blob/master/text_reader.py


Saludos.

domingo, 9 de junio de 2019

VISUALIZANDO IMAGENES CON PYTHON Y TKINTER.

En el presente articulo, me dispongo a exponer un método sencillo para visualizar imágenes en "python" haciendo uso de la librería gráfica "Tkinter" la cual viene instalada por defecto en las versiones recientes de "python".

En este ejemplo visualizaremos un archivo de imagen en formato "PNG", que lleva el nombre de "bigblue", el cual se muestra en la siguiente imagen:

bigblue

Dado que haremos uso del modulo "Tkinter", lo primero que haremos será importarlo con todas sus funciones (para lo que haremos uso del asterisco "*":

tkinter

Una vez importado el módulo, lo siguiente que haremos será crear la ventana (representada por la variable "ventana"):

ventana

Si ejecutamos este código, obtendremos una ventana vacía, a la espera de que empecemos a trabajar en ella :

venta

Ahora, lo siguiente que haremos será darle un titulo a nuestra ventana. Para lo que haremos uso del método ".title". En este caso le vamos a dar el nombre de "Uso de imágenes en Tkinter".

nomventa

Si, acto seguido, volvemos a ejecutar el programa obtendremos la misma ventana (la cual he expandido para que se vea el titulo) pero con el titulo que le hemos dado:

size

No obstante, nuestra ventana continua estando vacía. A continuación pasaremos ha introducir los datos conducentes a enmarcar nuestra imagen. Para ello haremos uso del método "geometry" mediante el cual especificaremos las dimensiones que queremos que tenga nuestra ventana:

geometry

Puesto que en este caso, vamos a querer que nuestra imagen ocupe todo el espacio de la ventana, lo que vamos a hacer es que nuestra ventana tenga las mismas dimensiones que la imagen que queremos visualizar. Para ello, primeramente, consultaremos las dimensiones de nuestro archivo de imagen:

bid

Así vemos que nuestra imagen tiene unas dimensiones de 568x516, con lo que acto seguido introduciremos tal información en nuestro visualizador de imagen:

carga_imagen

Una vez hecho esto procederemos a cargar la imagen ( la cual se almacenará en la variable "imagen") mediante la función "PhotoImagen", indicando el nombre del archivo en cuestión, con su correspondiente extensión ("bigblue.png") Tal y como se ve en la última línea de la imagen de arriba.
En este punto es interesante recordar el hecho de que, para poder cargar la imagen en nuestro programa, dicho archivo de imagen tiene que encontrarse ubicado en nuestra carpeta "python", tal y como e muestra en la siguiente imagen.

imagen_disponible

Sin embargo, si ahora ejecutamos el programa, seguirá apareciendo la ventana vacía. Esto es debido a que, con el paso anterior, lo que hemos hecho ha sido crear la variable que contiene nuestra imagen, pero no hemos hecho nada para que esta se visualice en la ventana (lo cual es lo que vamos a hacer a continuación).

ultim

Así, para incluir la imagen en nuestra ventana, haremos uso de una nueva variable ("fondo") la cual, incluiremos en nuestra "ventana" mediante la función "Label" e "image" la cual haremos igual a la variable "imagen" creada en el paso anterior. Como tenemos que especificar unas coordenadas para ubicar la imagen , introduciremos las coordenadas referidas a la esquina superior izquierda (x=0,y=0).

Finalmente escribiremos la instrucción "ventana.mainloop()" mediante la cual la ventana estará en pantalla hasta que decidamos cerrarla.
Hecho todo esto, procederemos a ejecutar nuestro programa (al que he dado el nombre de imagen.py").

ejecuta

Con lo que, ahora sí, nos aparecerá nuestra ventana, con la imagen enmarcada en su interior, tal y como se puede apreciar en la imagen de abajo.

finnn

Sobre esta ventana, aún se podrán incluir más elementos (como botones, etiquetas) de lo cual hablaré en futuros artículos.


Saludos.