PyQt verbinden bug Verfahren, wenn in einer for-Schleife verwendet, die aus einer Liste widgets schafft

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

  •  09-09-2019
  •  | 
  •  

Frage

Ich habe ein GUI-Programm,

Es Auto erstellen Schaltflächen aus einer Namensliste,  und eine Verbindung mit einer Funktion druckt seinen Namen.

aber wenn ich dieses Programm ausführen, drücke ich alle Tasten,

sie alle zurückkehren den Namen des letzten Taste.

Ich frage mich, warum dies geschieht. kann jemand helfen?

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

Ergebnis wie:

python t.py
DEBUG:root:c
DEBUG:root:c
DEBUG:root:c
War es hilfreich?

Lösung

Ich sehe zumindest einen Fehler im Code.

Ersetzen Sie:

 lambda :logging.debug(name)

Von:

 lambda name=name: logging.debug(name)

Siehe Warum Ergebnisse der map () und Liste Verständnis sind anders? .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top