"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué el uso de expresiones lambda y funciones de ranura PYQT causa un comportamiento inesperado?

¿Por qué el uso de expresiones lambda y funciones de ranura PYQT causa un comportamiento inesperado?

Publicado el 2025-04-16
Navegar:133

Why Does Using Lambda Expressions With PyQt Slots Lead to Unexpected Behavior?

usando expresiones lambda para conectar ranuras en pyqt

en pyqt, expresiones lambda se pueden usar para conectar señales a ranuras. Sin embargo, el uso de expresiones lambda en ciertos escenarios puede conducir a un comportamiento inesperado.

Considere el siguiente código:

class MainWindow(QtGui.QWidget):
    def __init__(self):
        ...
        self.buttons = []
        for idx in [3, 4]:
            button = QtGui.QPushButton('Button {} auto'.format(idx), self)
            button.clicked.connect(lambda x=idx: self.button_pushed(x))
            self.buttons.append(button)
            main_layout.addWidget(button)

Cuando se hacen clic en los botones, en lugar de recibir los valores esperados de 3 y 4, el método Button_Pushed recibe falso.

La razón de este comportamiento es que la señal haciendo clic de QpushButton emite un argumento que indica el estado del botón. Cuando se usa una expresión de lambda en la ranura, el valor asignado (como x = idx en este caso) se sobrescribe mediante el argumento emitido.

para resolver este problema, la expresión de lambda debe ignorar el estado de botón y usar un parámetro nombrado adicional:

button.clicked.connect(lambda state, x=idx: self.button_pushed(x))

Esta modificación asegura que el valor correcto se pase al método Button_Pushed, independientemente del estado del botón.

Comprender el mecanismo de las expresiones lambda también es crucial. En el contexto de las conexiones de ranura, la función Lambda no se evalúa cuando la señal dispara. En cambio, un puntero a la función (con los parámetros sustituidos) está conectado a la señal. Cuando se emite la señal, la función conectada se llama con los argumentos que pasa la señal.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3