In PyQt4 ist das Herstellen von Verbindungen zwischen Slots und Signalen ein grundlegender Aspekt der Ereignisverarbeitung. Wenn Sie jedoch versuchen, mehrere von Schaltflächen ausgegebene Signale innerhalb einer Schleife zu verbinden, kann es zu unerwartetem Verhalten kommen.
Um dieses Problem zu veranschaulichen, betrachten Sie den folgenden Code:
def __init__(self): for i in range(0, 10): self._numberButtons += [QPushButton(str(i), self)] self.connect(self._numberButtons[i], SIGNAL('clicked()'), lambda: self._number(i)) def _number(self, x): print(x)
Beim Klicken auf eines der Tasten zeigt die Ausgabe stets „9“ an, unabhängig davon, welche Taste gedrückt wurde. Um den Grund für dieses Verhalten zu verstehen, müssen Sie die Feinheiten der Scoping-Regeln von Python untersuchen.
In Python wird der Scoping einer Variablen durch die nächste einschließende Funktion bestimmt. In diesem Beispiel werden sowohl die Lambda-Funktion als auch die Funktion „_number“ innerhalb der Funktion „__init__“ definiert. Da die Schleife „i“ für jede Iteration den gleichen Wert („9“) zuweist, erfasst die Lambda-Funktion immer den letzten Wert, der „i“ innerhalb der Funktion „__init__“ zugewiesen wurde, also „9“.
Um dieses Problem zu lösen, besteht ein Ansatz darin, „i“ als Schlüsselwortargument mit einem Standardwert innerhalb der Lambda-Funktion zu übergeben und so sicherzustellen, dass für jede Instanz eine separate Bindung von „i“ erstellt wird.
self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))
Alternativ kann functools.partial verwendet werden, um eine spezielle Funktion zu erstellen, die „i“ an den spezifischen Wert bindet, der jeder Schaltfläche zugeordnet ist.
self._numberButtons[i].clicked.connect(partial(self._number, i))
Diese Änderungen garantieren, dass jede Rückruffunktion den korrekten Wert von erfasst 'i', um entsprechende Reaktionen auf Schaltflächenklicks zu ermöglichen.
Das obige ist der detaillierte Inhalt vonWarum gibt mein PyQt4-Tastenklicksignal innerhalb einer Schleife immer denselben Wert aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!