Verwenden Sie den Lambda-Ausdruck, um die Slots in pyqt @ zu verbinde

Ich versuche, Steckplätze mit Lambda-Funktionen zu verbinden, aber es funktioniert nicht so, wie ich es mir vorgestellt habe. Im folgenden Code ist es mir gelungen, die ersten beiden Tasten richtig zu verbinden. Bei den zweiten beiden, die ich in einer Schleife verbinde, geht das schief. Jemand vor mir hatte die gleiche Frage Qt - Verbinde den Slot mit dem Argument mit lambda), aber diese Lösung funktioniert bei mir nicht. Ich habe eine halbe Stunde lang auf meinen Bildschirm gestarrt, aber ich kann nicht herausfinden, wie sich mein Code unterscheidet.

class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(QtGui.QWidget, self).__init__()

        main_layout = QtGui.QVBoxLayout(self)

        # Works:
        self.button_1 = QtGui.QPushButton('Button 1 manual', self)
        self.button_2 = QtGui.QPushButton('Button 2 manual', self)
        main_layout.addWidget(self.button_1)
        main_layout.addWidget(self.button_2)

        self.button_1.clicked.connect(lambda x:self.button_pushed(1))
        self.button_2.clicked.connect(lambda x:self.button_pushed(2))

        # Doesn't work:
        self.buttons = []
        for idx in [3, 4]:
            button = QtGui.QPushButton('Button {} auto'.format(idx), self)
            button.clicked.connect(lambda x=idx: self.button_pushed(x))
            self.buttons.append(button)
            main_layout.addWidget(button)


    def button_pushed(self, num):
        print 'Pushed button {}'.format(num)

Durch Drücken der ersten beiden Tasten werden "Pushed Button 1" und "Pushed Button 2" ausgegeben, während die beiden anderen Tasten "Pushed Button False" ausgeben, obwohl ich mit 3 und 4 gerechnet habe.

Ich habe auch den Lambda-Mechanismus nicht vollständig verstanden. Was genau wird verbunden? Ein Zeiger auf eine Funktion, die von Lambda generiert wird (mit dem Parameter, der durch ersetzt wird), oder wird die Lambda-Funktion bei jedem Auslösen des Signals ausgewertet?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage