Blog
¿Qué es PyQT5?
Es un binding de la biblioteca gráfica QT para el lenguaje de programación Python. PyQT5 nos permite crear interfaces gráficas con python de manera rápida y sencilla, la legibilidad del código de Python hace que sea una tarea sumamente sencilla realizar interfaces gráficas, además que también posee una interfaz de diseño para crear nuestras interfaces gráficas.
La flexibilidad que tiene esta biblioteca, es que podemos diseñar por completo nuestras interfaces y luego comenzar a programar, esto es un punto muy importante, ya que si has utilizado Tkinter para realizar interfaces gráficas con Python sabrás de lo forzoso que es tener que ir diseñando y programando a la vez.
➡ Te invitamos a realizar el Curso Gratis de Python para Principiantes :
Con Tkinter se puede diseñar primero y luego programar, pero el punto que contradice todo acá es que en Tkinter el diseño no lo hacemos a través de una interfaz de diseño como la posee PyQT5, si no que el diseño lo hacemos escribiendo más código.
Recomendaciones a tomar en cuenta antes de usar PyQT5
- Conocer la programación orientada a objetos, por lo menos en un nivel básico-medio para entender la librería.
- Tener un buen manejo de la consola.
- Entender los diferentes mecanismos de una interfaz gráfica como botones, inputs, eventos y entre otros. (Consultar documentación de PyQT5)
Creando nuestro primer programa
Vamos a crear con esta librería el típico Hello World, para ello primero debemos instalar la librería PyQt5
pip install PyQt5
Una vez instalada ya podemos hacer uso de la librería, pero aún nos faltan sus herramientas que es donde vendrá la instalación del “Designer” o el diseñador que es el programa de la librería que generará nuestro código para que se materialice la ventana con nuestra interfaz gráfica, entonces vamos a instalarla:
pip install pyqt5-tools
Al finalizar ya tendremos instalado tanto la biblioteca como el designer, para encontrar el designer vamos a la carpeta de instalación de Python. Si estas en Windows como en mi caso, puedo presionar la tecla Windows+R y luego escribir lib y luego en el directorio que se abre buscar la carpeta site-packages y dentro buscar la carpeta pyqt5_tools/Qt/bin/ y buscamos el designer.exe.
Puedes crear un acceso directo al escritorio para no tener que abrirlo cada vez de esta manera, entonces abramos el designer y haremos lo siguiente:
Seleccionamos Main Window y hacemos click en create, esto creará nuestra ventana y luego arrastraremos un botón del tipo Push Button. Puedes situarlo en la parte que desees, luego haz doble click sobre él y podrás cambiarle el nombre.
En mi caso lo he nombrado como print Hello World y lo he situado en el medio de mi ventana, ahora vamos a guardarlo, para ello vamos a File y luego hacemos click en save o también podemos usar Ctrl+S para guarda, le voy a colocar el nombre de HelloWorld y lo guardaré en mi escritorio para acceder más fácil a él.
Ya con esto tenemos nuestra interfaz gráfica, ahora solo falta decirle a PyQT5 que escriba el código en Python, para ello abrimos una consola nueva en el mismo directorio donde se encuentre el archivo y escribimos el siguiente comando:
λ pyuic5 -x HelloWorld.ui -o HelloWorld.py
- -x Es para indicarle a PyQT5 cual es el archivo que queremos escribir en código Python.
- -o Le indica a PyQT5 el archivo que debe crear con codigo de Python
Hecho esto, veras que si vas a la ubicación donde tenias tu archivo que en mi caso es el escritorio, veremos que se nos ha creado un nuevo archivo, que si lo ejecutamos se abrirá la ventana que hemos creado anteriormente. Pero esto es solo la interfaz, hasta ahora este programa no posee lógica de programación.
Entonces, lo que yo quiero hacer es que al realizar click en el botón, este me reproduzca un Hello World por consola y para ellos vamos a cerrar la interfaz gráfica y abrimos el archivo HelloWorld.py con nuestro editor de código, al principio veremos el código generado por PyQT5 que es el siguiente:
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'HelloWorld.ui' # # Created by: PyQt5 UI code generator 5.13.0 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(501, 440) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(190, 160, 121, 51)) self.pushButton.setObjectName("pushButton") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 501, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.pushButton.setText(_translate("MainWindow", "Print Hello World:D")) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())
Aquí solo falta agregarle al botón un evento para que cuando se haga un click en el imprima un Hello World por consola, entonces agreguemos al código un nuevo método llamado printHello y luego lo bindeamos a los eventos de los botones dentro del constructor de la clase:
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'HelloWorld.ui' # # Created by: PyQt5 UI code generator 5.13.0 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(501, 440) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(190, 160, 121, 51)) self.pushButton.setObjectName("pushButton") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 501, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.pushButton.clicked.connect(self.printHello) # 2) Llamamos al botón dentro del constructor de la clase y lo connectamos al evento click y como argumento le pasamos el método que creamos recientemente llamado printHello def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.pushButton.setText(_translate("MainWindow", "Print Hello World:D")) def printHello(self): # 1) Creamos el método printHello print("Hello world desde el boton push") if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())
Guardamos los cambios y ejecutamos nuevamente la interfaz haciendo doble click en ella y deberíamos de obtener un Hola mundo por pantalla cada vez que presionemos el botón:
Esto es un ejemplo básico de interfaces gráficas con PyQT5, puede que más adelante usemos más a fondo esta librería para crear un proyecto mucho más sólido y robusto, pero con esto obtenemos las bases de la librería.