PyQt conectar método de error cuando se utiliza en un bucle que crea widgets de una lista

StackOverflow https://stackoverflow.com/questions/736651

  •  09-09-2019
  •  | 
  •  

Pregunta

Tengo un programa de interfaz gráfica de usuario,

crear automáticamente los botones de una lista de nombres,  y conectarse a una función imprime su nombre.

pero cuando ejecuto este programa, se presiona todos los botones,

todos ellos regresan el nombre del último botón.

Me pregunto por qué esto sucede. puede ayudar a cualquiera?

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import logging

logging.basicConfig(level=logging.DEBUG,)

class MainWindow(QWidget):
    def init(self):
        names = ('a','b','c')
        lo = QHBoxLayout(self)
        for name in names:
            button = QPushButton(name,self)
            lo.addWidget(button)
            self.connect(button,SIGNAL("clicked()"),
                         lambda :logging.debug(name))

if __name__=="__main__":
    app = QApplication(sys.argv)
    m = MainWindow();m.init();m.show()
    app.exec_() 

resultado como:

python t.py
DEBUG:root:c
DEBUG:root:c
DEBUG:root:c
¿Fue útil?

Solución

Veo por lo menos un error en el código.

Reemplazar:

 lambda :logging.debug(name)

Por:

 lambda name=name: logging.debug(name)

Por qué los resultados de mapa () y la lista de comprensión son diferente? para más detalles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top