Heim >Backend-Entwicklung >Python-Tutorial >Warum führt die Verwendung von Lambda-Ausdrücken mit PyQt-Slots zu unerwartetem Verhalten?

Warum führt die Verwendung von Lambda-Ausdrücken mit PyQt-Slots zu unerwartetem Verhalten?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-19 20:43:02922Durchsuche

Why Does Using Lambda Expressions With PyQt Slots Lead to Unexpected Behavior?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn