Curso de programacion en python3 : 09 - PySide2, añadir una GUI en sencillos pasos

Esta entrada es parte de una serie, puedes ver la primera aquí


Hola buenas tardes, después de tomarme mi tratamiento por dos días, he encontrado hasta que punto la buena diabetes puede afectar a quien la padece, continuando con el ejemplo de orientación a objetos anterior, se me ha ocurrido la brillante idea de crear una Graphical User Interface(GUI, interfaz gráfica de usuario), hasta hace unos meses intenté utilizar TKinter, no negaré que funciona, pero el propio Guido van Rossum ha declarado que fue un grave error integrar TKinter como GUI por defecto para python.

Es bastante agradable como se ven las GUI creadas con Qt, haciendo un barrido durante días, encontré que existe un paquete bien licenciado que nos permite programar tal cual como se hace en Qt, pero de forma nativa y bajo licencia LGPL, aunque se le hace mas publicidad a PyQt, esta tiene un doble licenciamiento y por tanto en proyectos comerciales hay que pagar una licencia, resumiendo y revisando todo lo que se ha escrito, al final he preferido PySide2 que es compatible con todo Qt y libre.

Como no será novedad, escribí mal el nombre del paquete en el commit de git, vergüenza sobre mi vaca, para instalar PySide2 utilizaremos a nuestro amigo pip.

> pip3 install PySide2

Si alguno ha utilizado entornos virtuales de python y cosas de personas que si saben utilizar las herramientas que el lenguaje nos provee, pues sabrá como montar el paquete en un entorno, yo lo instalé con privilegios de administrador esto no es necesario si trabajamos con un solo usuario y tampoco lo es cuando tengo la costumbre de destrozar inconscientemente mi instalación de linux una vez al año.

Descarados los paquetes al entorno de python, podremos empezar a desgranar el código según los componentes principales de PySide2, empezando con el paquete PySide2.QWidgets que es la raíz de todos los componentes, al ser el componente padre en la jerarquía, permite que se instancien todos los heredados por este, importamos QApplication que permite ejecutar acciones a bajo nivel sobre todo el entorno, cosas como revisar las ventanas de la aplicación QWidgets, ejecutar comandos del sistema huesped o cerrar todas las ventanas abiertas del programa.

QMainWindow es el contenedor de ventanas principal, este contenedor tiene una forma de caja que resulta especialmente simple para agregar los componentes(widgets), podemos añadir componentes en Menu Bar(colocar la clásica barra de menús arriba de la ventana), Status Bar (añadir componentes a bajo de la ventana), podemos colocar objetos en el Toolbar que viene a ser una caja entre la barra de menús y la barra de estado, dentro de esta tenemos a un Dock Widgets que es otro cuadrado dentro del anterior y por ultimo el Central Widgets, lo único que necesité como idea para cambiar entre las tres vistas usando una sola ventana.



QDialog es un componente de alto nivel, la idea es crear ventanas emergentes, en este caso es lo que utilizo como marco removible, no es el componente mas eficiente para esta tarea, QFrame es el componente ideal para realizar esta tarea, pero es tan solo un guarda espacios (placeholder) tiene algunas funciones menos y por simple vagancia prefiero dejarlo así a menos que llegue a notar problemas de rendimiento cuando continúe el proyecto.

Los componentes para interactuar con el usuario utilizados es QLabel para colocar etiquetas de texto, QPushButton para añadir botones, QLineEdit son los campos de texto y por ultimo QVBoxLayout, como soy aficionado a dejar que el equipo acomode los componentes a como le place, no podía dejar de lado a este componente, aquí no se verá una sola coordenada.

El orden de ejecución es muy sencillo, creamos un main que instancia el controlador de ejecución QApplication, dejamos una variable raíz de alcance global a la cual le instanciamos QMainWindow por que es necesario tener control de la ventana dentro de las clases que la componen, como arranque del loop infinito le cedemos el control a la clase ventanaPrincipal con el método setCentralWidget de la raíz, la instanciamos de manera anónima para que el recolector de basura se la lleve una vez la sustituya por otra, la raiz se vuelve con el método .show() y para garantizar que python ceda el cierre del programa a las bibliotecas de PySide2, se le dice que la condición de salida será cuando lo declare nuestro amigo QApplication(aquí llamado app, por que se me olvidó que en código limpio se desaconseja hacer esto, debería haber hecho una instancia anónima).

if __name__=='__main__' :
     app = QApplication(sys.argv)
     raiz = QMainWindow()
     raiz.setCentralWidget(ventanaPrincipal())
     raiz.show()
     sys.exit(app.exec_())

Cada clase contiene la misma estructura, todas heredan de QDialog, se inicializan en el __init__(self, parent = None), por que vamos a decirle a la clase padre(QDialog) que no tiene padre, por que solo nos servirá para añadirla en nuestra raíz, le decimos a raíz cual será el titulo de la ventana y a continuación llamamos a la instancia de nuestra clase, dentro de la clase se contienen los componentes, se añaden todos al controlador de la ventana(layout, por que escribir código en un solo idioma es ilegal XD ) y este es añadido a la clase padre, luego conecto los dos métodos  a los botones, es exactamente igual a lo que se hace en GodotEngine con las señales, esto ultimo me parece bien.

Para ver el código completo, de ahora en adelante voy a utilizar simplemente los enlaces de Git, haciendo que yo no tenga que volverme loco con blogger, ni repetir varias veces la misma cosa, mucho menos voy a necesitar actualizar las entradas del blog cada vez que altero el código fuente de un proyecto, de todas formas, creo que en los próximos días voy a estar modificando los errores que encontré al redactar la entrada.

Espero que esta entrada sea de utilidad, yo al menos voy a dedicarle mas tiempo al bueno de PySide2, voy a empezar a hablar sobre bases de datos y de paso, terminaré haciendo que este pequeño proyecto imaginario se convierta en una lección integral de python, bases de datos y GUI.

Comentarios

Entradas populares de este blog

Hablemos de difamación, parafilias y denuncias bien hechas

Criticamos a pablito: "Atrapado en el cuerpo equivocado"

El fruto de una era: Antiintelectualismo moderno