PyQt connecter bug méthode lorsqu'il est utilisé dans une boucle qui crée des widgets à partir d'une liste

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

  •  09-09-2019
  •  | 
  •  

Question

J'ai un programme GUI,

boutons créer automatiquement à partir d'une liste de noms,  et se connecter à une fonction imprime son nom.

mais quand je lance ce programme, j'appuie sur tous les boutons,

ils renvoient tous le nom du dernier bouton.

Je me demande pourquoi cette chose arrive. peut-on aider?

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_() 

résultat comme:

python t.py
DEBUG:root:c
DEBUG:root:c
DEBUG:root:c
Était-ce utile?

La solution

Je vois au moins un bug dans votre code.

Remplacer:

 lambda :logging.debug(name)

Par:

 lambda name=name: logging.debug(name)

Voir Pourquoi les résultats de la carte () et la compréhension de la liste sont différent? pour plus de détails.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top