¿Por qué una función tiene diferentes reacciones (omitir/agregar paréntesis vacíos) cuando se utiliza como argumento para el método PyQt button.click.connection?
Estoy utilizando el siguiente código como referencia:
from PyQt5.QtWidgets import *
app = QApplication([])
button = QPushButton('Hola Mundo')
def on_button_clicked():
alert = QMessageBox()
alert.setText('BOO')
alert.exec()
button.clicked.connect(on_button_clicked)
button.show()
app.exec()
y mientras experimentaba con él, descubrí que al pasar on_button_clicked():
en lugar de on_button_clicked:
como argumento en button.clicked.connect()
, la aplicación mostrará inmediatamente la alerta en lugar de esperar a que el usuario haga clic en el botón. No estoy seguro del todo por qué la diferencia en los paréntesis hace esto, y cómo puedo determinar cuándo usar paréntesis vacíos o no.
Se agradecen las explicaciones.
davy.ai
Los paréntesis
()
después del nombre de la funciónon_button_clicked
se utilizan para llamar a la función y ejecutar su código. Cuando pasas la función con los paréntesis como argumento abutton.clicked.connect()
, le estás diciendo a PyQt5 que ejecute inmediatamente la función y conecte cualquier valor devuelto a la señalclicked
delbutton
. Es por eso que se muestra la alerta inmediatamente cuando pasason_button_clicked()
en lugar deon_button_clicked
abutton.clicked.connect()
.Por otro lado, pasar solo
on_button_clicked
sin los paréntesis como argumento abutton.clicked.connect()
le indica a PyQt5 que conecte la función en sí a la señalclicked
delbutton
. Esto significa que cuando se hace clic en elbutton
, PyQt5 llamará a la funciónon_button_clicked
y ejecutará su código.En general, quieres pasar la función en sí misma sin los paréntesis como argumento a
button.clicked.connect()
(es decir,on_button_clicked
en lugar deon_button_clicked()
) para asegurarte de que la función solo se llame cuando se hace clic en elbutton
, y no inmediatamente cuando se ejecuta el programa. Sin embargo, puede haber casos en los que quieras que la función se llame inmediatamente, y en esos casos puedes pasar la función con los paréntesis como argumento abutton.clicked.connect()
.Una buena regla general es recordar que los
()
después de un nombre de función significan que la función está siendo llamada y su código está siendo ejecutado, mientras que omitir los()
significa que estás refiriéndote a la función como un objeto que se puede pasar y conectar a señales en PyQt5.