PyQt bug método connect quando usado em um loop que cria elementos a partir de uma lista
Pergunta
Eu tenho um programa GUI,
É auto criar botões a partir de uma lista de nomes, e ligar a uma função imprime seu nome.
mas quando eu executar este programa, eu pressionar todos os botões,
que todo o retorno do último botão nome.
Eu me pergunto por que isso acontece. qualquer um pode ajudar?
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
Solução
Eu vejo pelo menos um bug em seu código.
Substituir:
lambda :logging.debug(name)
Por:
lambda name=name: logging.debug(name)
Consulte Por resultados do mapa () e compreensão da lista são diferente? para mais detalhes.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow