Buenas a mis lectores! Siguiendo con PyQt5, vamos a ver objetos, señales y ranuras. También suelen llamarse Signals y Slots en ingles. O la podemos encontrar como una relación
Objeto-Evento-Señal-Función.
En Python casi todo es un objeto, una clase o una función..
Y es tan importante saber diferenciarlos, como también aprender de su relación y el porque de la misma.
Objeto
Pero veamos, que tanto un botón (visible o no) como «carlitos» es un objeto porque según la Wikipedia por ejemplo su definición corresponde a :
Unidad dentro de un programa de computadores que consta de un estado y de un comportamiento, que a su vez constan respectivamente de datos almacenados y de tareas realizables durante el tiempo de ejecución
Si tiene una «razón de existir durante la ejecución de nuestro programa» es un objeto. Ahora también cada objeto así como una razón y un porque puede generar un Evento. Clicar este Botón es un Evento.
Eventos
Un evento entonces puede definirse como toda «acción que realiza el usuario sobre un objeto«. Si en algún punto se invoca a el objeto «carlitos» mediante un método por ejemplo «carlitos.hablar(«Hola») también es un evento producido por el usuario. Así como cliquear un botón, mover una barra, presionar una tecla que se solicita o cerrar un dialogo». Estos eventos producen «Señales»
Señales
Pero, ¿que son las señales?. Un señal es aquello que se emite cuando ocurre un evento en particular, por ejemplo un clic. Esta señal es enviada para conectar a un Slot o «Ranura», que también podemos vagamente mal-llamar en nuestro idioma «Función». Los Widgets de Qt tienen muchas señales predefinidas, pero siempre podemos subclasificar widgets para agregarles nuestras propias señales. Y finalmente una ranura o función sera aquello que responde a la señal generando una acción. Qt mediante sus Widgets tiene también ranuras predefinidas.
Ranuras o funciones
Como decíamos anteriormente una ranura puede ser por ejemplo la ejecución de un bloque de código que cambie el label de un texto. Este código sera ejecutado cuando detecte una señal que sera enviada por un objeto por ejemplo un «botón». Entonces esta ranura o función estará «a la escucha, o espera» de la señal que genere el objeto.
Relación Objeto – Evento – Función u (Objeto, señal, ranura)
¿Y porque tantas formas de referirse a lo mismo?. No lo se, pero puedes llamarle o aprenderla como mas te guste, en mi caso prefiero decirles Objeto, evento y función. Por una cuestión practica mía, pero es importante conocer estos otras variaciones de nombres tanto en español como ingles para no confundirnos al absorber información de distintas fuentes. Sobre todo si eres un autodidacta de la vida como yo 😛
Veamos esta relación expresada primero en un gráfico para que te quede grabada a fuego!. Soy consciente del poder del material audiovisual 😉
En la imagen puedes ver que primeramente todo comienza al presionar el botón apagar. La acción del usuario de presionarlo (evento) dispara una señal que la función (ej : de guardar los datos del sistema y cerrarlo correctamente) esta esperando. Como la ha recibido se dispone a ejecutar una serie de procesos (funciones, slots) y finalmente nuestro equipo se apaga.
Piensa en esto, que pasaría si tienes abierto un programa que esta realizando cambios en el Disco Duro de tu computadora. No seria bueno que ese programa capture esta señal y la detenga advirtiéndote «Estas por apagar el equipo mientras estoy realizando cambios, podría acabar esto en una explosión» por ejemplo. Seguramente te ha sucedido cuando alguna aplicación se tilda y le mandas un «botonazo» o ordenas apagar la pc. Pues esa aplicación estaba programada para detectar y «detener» una señal de apagado para prevenir fallos futuros. O al menos debería.
Ahora esto en Python fácilmente se puede expresar en la siguiente lección donde cambiamos un label al presionar un botón. Aquí te dejo el código de ejemplo donde te identifico objeto, evento y función.
#Función que se llama al presionar def FuncionPresionar(): self.label.setText("Un clavito clavo Pablito") #Acción al presionar el botón self.pushButton.clicked.connect(FuncionPresionar) # Objeto-----> Evento---> Conectar --> Función o ranura #########Objeto Botón.Evento(clicked).Conectar -> Función #########El objeto botón mediante el evento clic envía la señal #########de conectar a la función.
Y ya lo tienes, presionas el botón, se envía la señal y la función sucede!
Aclaración y algunos consejos para aprendices de Python
La verdad es que veníamos muy sencillos y parece que desde que empezamos con Pyqt5 esto es un ovillo sin principio ni final. Se encuentran muchas confusiones dando vueltas y logro detectar que un porcentaje de quienes aprenden programación en python (sobre todo si es el primer lenguaje), no cruza este umbral de comenzar a utilizar Python fuera de la consola. Aquí quiero dejarte algo de mi experiencia propia dentro y fuera de Python:
Si aveces lees código y no entiendes, ademas de buscar en Google y preguntar, debes seguir leyéndolo en ese momento, guardando ese pedazo de código que no comprendemos como una incógnita en nuestras cabezas. Y así proseguimos con lo demás y ya veras que luego esclarece; tomando sentido todo el código como un solo objeto, que a su vez, es la suma de sus partes.
Normalmente es un error a mi forma de verlo que quienes aprenden programación se estanquen en código que no entienden. Pues tampoco debemos ver el código como si fuera un texto que va por palabras, oraciones, párrafos y debemos leer. Sino que esta bueno verlo en tu lado creativo como un «todo se relaciona con todo» y ese bloque que no se entiende, marcarlo como una interrogación y seguir. Si no seguimos, si nos estancamos también lo hace nuestro cerebro, y las ganas de tirar todo por la ventana se hacen escuchar.
Avanza, avanza..!. Ya te harás un experto, y una vez tengas la app que sueñas te encargas de los detalles y minucias. Solo mientras funcione todo, esta bien. Evitemos la parálisis por análisis que es donde muere el 99% de los aprendices y las aplicaciones millonarias. La búsqueda y corrección de errores tontos o el «código perfecto» déjalos para el final, solo lánzate!
quien podria ayudar ha crear un programa con pytohn