Heim >Backend-Entwicklung >Python-Tutorial >Warum führt die Verwendung von Lambda-Ausdrücken mit PyQt-Slots zu unerwartetem Verhalten?
Verwenden von Lambda-Ausdrücken zum Verbinden von Slots in PyQt
In PyQt können Lambda-Ausdrücke verwendet werden, um Signale mit Slots zu verbinden. Allerdings kann die Verwendung von Lambda-Ausdrücken in bestimmten Szenarien zu unerwartetem Verhalten führen.
Beachten Sie den folgenden Code:
class MainWindow(QtGui.QWidget): def __init__(self): ... 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)
Wenn auf die Schaltflächen geklickt wird, anstatt die erwarteten Werte 3 und 4 zu erhalten , erhält die button_pushed-Methode „False“.
Der Grund für dieses Verhalten ist, dass das angeklickte Signal von QPushButton ein Argument ausgibt, das den Zustand der Schaltfläche angibt. Bei Verwendung eines Lambda-Ausdrucks im Slot wird der zugewiesene Wert (wie in diesem Fall x=idx) durch das ausgegebene Argument überschrieben.
Um dieses Problem zu beheben, sollte der Lambda-Ausdruck den Schaltflächenstatus ignorieren und verwenden ein zusätzlicher benannter Parameter:
button.clicked.connect(lambda state, x=idx: self.button_pushed(x))
Diese Änderung stellt sicher, dass der korrekte Wert an die button_pushed-Methode übergeben wird, unabhängig vom Zustand der Schaltfläche.
Das Verständnis des Mechanismus von Lambda-Ausdrücken ist ebenfalls von entscheidender Bedeutung. Bei Slot-Verbindungen wird die Lambda-Funktion beim Auslösen des Signals nicht ausgewertet. Stattdessen wird ein Zeiger auf die Funktion (mit den ersetzten Parametern) mit dem Signal verbunden. Wenn das Signal ausgegeben wird, wird die verbundene Funktion mit den Argumenten aufgerufen, die das Signal übergibt.
Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung von Lambda-Ausdrücken mit PyQt-Slots zu unerwartetem Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!