"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é la señal al hacer clic en el botón PyQt4 siempre genera el mismo valor dentro de un bucle?

¿Por qué la señal al hacer clic en el botón PyQt4 siempre genera el mismo valor dentro de un bucle?

Publicado el 2024-11-16
Navegar:324

Why Does My PyQt4 Button Clicked Signal Always Output the Same Value Within a Loop?

Conectar ranuras y señales en PyQt4 dentro de un bucle

En PyQt4, establecer conexiones entre ranuras y señales es un aspecto fundamental del manejo de eventos. Sin embargo, al intentar conectar varias señales emitidas por botones dentro de un bucle, puede surgir un comportamiento inesperado.

Para ilustrar este problema, considere el siguiente código:

def __init__(self):
    for i in range(0, 10):
        self._numberButtons  = [QPushButton(str(i), self)]
        self.connect(self._numberButtons[i], SIGNAL('clicked()'), lambda: self._number(i))

def _number(self, x):
    print(x)

Al hacer clic en cualquiera de los botones, la salida muestra constantemente '9', independientemente del botón que se presionó. Comprender el motivo detrás de este comportamiento implica explorar las complejidades de las reglas de alcance de Python.

En Python, el alcance de una variable está determinado por la función circundante más cercana. En este ejemplo, tanto la función lambda como la función '_number' se definen dentro de la función '__init__'. Dado que el bucle asigna el mismo valor ('9') a 'i' para cada iteración, la función lambda siempre captura el último valor asignado a 'i' dentro de la función '__init__', que es '9'.

Para resolver este problema, un enfoque es pasar 'i' como argumento de palabra clave con un valor predeterminado dentro de la función lambda, asegurando que se cree un enlace separado de 'i' para cada instancia.

self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))

Como alternativa, se puede emplear functools.partial para crear un función especializada que vincula 'i' al valor específico asociado con cada button.

self._numberButtons[i].clicked.connect(partial(self._number, i))

Estas modificaciones garantizan que cada función de devolución de llamada capture el valor correcto de 'i', permitiendo respuestas apropiadas a los clics en los botones.

Ú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