returnPressed en QComboBox

El problema con la señal returnPressed en QComboBox

Bueno, en esta ocasión voy a hablaros de un problema bastante común que es la imposibilidad de hacer uso de una la señal returnPressed en un QComboBox de PyQt4, los bindings en Python de las librerías Qt de Trolltech.

Una manera rápida de optimizar el trabajo en GUI’s de introducción de datos es hacer saltar el foco de la aplicación al widget que continúa el ciclo de trabajo una vez terminada la edición en el widget anterior. Por ejemplo, si tenemos varios QLineEdit, lo suyo es que el primero pase el foco al segundo, éste al tercero, y así sucesivamente. Esto lo conseguimos, en el caso de QLineEdit, conectando la señal returnPressed() al slot setFocus() del siguiente widget.

Lo ideal es que si en lugar de un QLineEdit tenemos un QComboBox, ocurra igual, es decir, que una vez entrado en éste, al seleccionar un elemento y pulsar [Enter] se pase el foco al widget siguiente. El problema con las librerías Qt4 y, por extensión, PyQt4 , es que se “olvidaron” implementar la señal returnPressed en QComboBox… o no exactamente…

Primeros pasos

Buscando por la red encontré una solución parcial. Al parecer, cuando uno crea un QComboBox editable, el propio comboBox contiene un QLineEdit del cual podemos aprovechar sus señales y conectarlas a slots, accediendo al QLineEdit mediante el método lineEdit() de QComboBox. Por ejemplo, si tuviéramos en nuestro diálogo un QComboBox llamado comboNuevo y quisiéramos conectarlo con la señal setFocus() de otro widget:

ejemplo de returnPressed en QComboBox

Este es el aspecto de un QComboBox con la señal returnPressed habilitada

Como hemos dicho, es preciso que hayamos definido comboNuevo como editable. De esta manera, contendrá un LineEdit; de no ser así, obtendremos una excepción.

La solución para usar la señal returnPressed en QComboBox

La solución es bien sencilla y se trata, simplemente, de indicar que el LineEdit de nuestro QComboBox es de sólo lectura. De esta manera podremos hacer uso de la señal returnPressed en QComboBox:

Bien sencillo y evita tener que hacer engorrosas clases personalizadas, lo que es complicado sobre todo cuando se emplea QtCreator.

¡¡¡Espero que os sirva de ayuda!!!

PostgreSQL a excel con Python

Exportar datos desde PostgreSQL a excel

Exportar datos desde PostgreSQL a excel no es sencillo… Si como base de datos nos referimos a MS Access, no es mayor problema. Pero si nos referimos a una base de datos más… de verdad, como puede ser PostgresSQL o MySQL o cualquier otro sistema gestor de bases de datos ya no es lo mismo. Nosotros nos vamos a ocupar en este artículo de esportar datos desde PostgreSQl a excel con Python. Nótese que donde digo excel digo LibreOffice/OpenOffice Calc también, por supuesto.

Exportar datos desde PostgreSQL a excel

Exportar datos desde PostgreSQL a excel puede ser muy sencillo

La manera sencilla pero poco productiva consiste en exportar los datos desde PostgreSQL a excel  creando un archivo de texto (valores separados por comas o como nos convenga) mediante el comando de psql \copy:

Luego este archivo lo importamos mediante excel y listos.

Pero aquí la cosa se trata de sacar directamente la información desde PostgreSQL a excel, es decir,  obtener un bonito archivo xls o xlsx mediante unas pocas líneas de código.

Herramientas necesarias

  • Servidor PostgreSQL funcionando (mi versión es la 9.0). La manera más sencilla de obtenerlo es mediante tu gestor de paquetes si utilizas Linux.
  • Python 2.7 instalado en tu computadora. Viene instalado por defecto en cualquier distribución Linux al uso (OpenSUSE, Ubuntu…)
  • PygreSQL, módulo Python openSource que permite la interacción con servidores PostgreSQL. Te recomiendo instalar la versión 4.11. En mi caso, tuve que instalarla mediante pip y no mediante el gestor de paquetes, que me ofrecía la versión 4.0. Es preferible la versión 4.11 que ofrece pip por disponer de ciertos métodos convenientes para manejar los resultados de las consultas.
  • Pandas, módulo Python que provee de herramientas sencillas y de alto rendimiento para análisis de datos y estructuras de datos de manejo sencillo, instalable tanto desde paquetes como a través de easy_install o pip.
  • Módulos Python xlwt y openpyxl, necesarios para que Pandas funcione correctamente. Se pueden instalar sin porblemas mediante easy_install, pip o tu gestor de paquetes. Estos son los módulos que permiten que python interaccione con archivos xls y xlsx.

Con todas estas herramientas instaladas, ya podemos ponernos a exportar datos desde PostgreSQL a excel.

PostgreSQL a excel con Python: Pasos a seguir

Los pasos que  tenemos que seguir son bastante sencillos. Exportar una tabla de una base de datos (o una consulta cualquiera, ojo) a excel mediante python es materia de sólo unas pocas líneas de código, como podréis ver

1. Importamos los módulos python necesarios y dotamos a nuestro archivo de script del sharpbang necesario para que se ejecute en nuestro sistema:

2. Creamos una conexión a la base de datos con pygresql:

3. Hacemos una consulta a la base de datos para obtener los datos que exportaremos desde PostrgreSQL a excel, también mediante las funciones de pygresql:

4. Comprobaremos si la consulta ha recuperado datos (¡Importante: si no lo hacemos, en caso de que no haya recuperado nada, tendríamos que gestionar la excepción que se generará!). Si es así, convertiremos esos datos a un objeto del tipo DataFrame de pandas, donde podremos, si la exportación desde PostgreSQL a excel lo requiriese, hacer manipulaciones adicionales sobre los datos (cálculos, etc):

Lo que hacemos aquí es indicar que el objeto DataFrame estará constituido por los datos de la consulta, que es lo que se consigue mediante datos.getresult()  y darle un nombre a las columnas del DataFrame al pasarle una tupla python de los nombres de columna mediante  datos.listfields()

Podríamos dar cualquier otro nombre de columnas si quisiéramos. Por ejemplo, al pasar datos de PostgreSQL a excel dispusiéramos de cuatro columnas y quisiéramos darles los nombres nombre, apellidos, fecha, regalo, sólo tendremos que crear una tupla python  con los nombres de las columnas y pasárselos al crear el DataFrame:

6. Exportaremos el DataFrame con los datos de nuestra base de datos PostgreSQL a excel… esto es sencillísimo ya que el objeto DataFrame de pandas dispone del método to_excel() que facilita enormemente las cosas y… ¡listos!

El parámetro index indica si se deben guardar los datos con el índice de las filas o no. Si lo hubiéramos puesto a True, la primera columna de nuestra hoja de cálculo sería ese índice, o sea, la numeración de las líneas. Esto no suele ser de interés al pasar los datos desde una base de datos cualquiera o PostgreSQL a excel.

Si empleas la extensión xls en tu archivo, se generará un archivo compatible con excel 2007, para lo que pandas necesita del módulo xlwt . Si utilizas xlsx se generará un archivo compatible con las últimas versiones de excel y pandas precisa del módulo openpyxl, de ahí la necesidad de tenerlos instalados para exportar datos de PostgreSQL a excel.

¡OJO!

Existe un problema frecuente y que no he conseguido resolver relativo a la imposibilidad de exportar datos si estos contienen caracteres acentuados y especiales. Cuando este problema te suceda al exportar a xls, exporta tus datos al formato xlsx. Parece ser la única solución por el momento.

 

Todo esto lo podemos juntar en un sencillo script:

Guardamos nuestro script en un archivo y otorgamos permisos de ejecución al script mediante  chmod +x miscript.py

Y ya está… este trozo de código se podría utilizar como parte de aplicaciones más grandes, para sacar informes desde PostgreSQL a excel. Por cierto: con otras bases de datos se procedería de igual manera. Apenas sería necesario cambiar el módulo pygresql por otro que te permita conectarte con tu base de datos preferida (MySQL, SQLite…)