PyQt4-Slots und -Signale in einer Schleife verbinden: Fehlerbehebung bei unerwarteten Ergebnissen
Beim Erstellen eines Taschenrechners in PyQt4 wurde die Verbindungsschaltfläche „angeklickt()“ Signale innerhalb einer Schleife können zu unerwartetem Verhalten führen. Das Problem entsteht, weil die erwartete Zahl nicht gedruckt wird, wenn auf eine Schaltfläche geklickt wird. Stattdessen geben alle Schaltflächen die gleiche Nummer aus.
Das Problem verstehen
Die Scoping-Regeln von Python erzeugen in diesem Szenario einen Abschluss. Die Schleifenvariable „i“ wird als Parameter für die Lambda-Funktion jeder Schaltfläche verwendet. Allerdings löst Python „i“ im Namespace der umschließenden Funktion (__init__()) auf. Da „i“ in der Schleife geändert wird und schließlich der Wert 9 zugewiesen wird, beziehen sich alle Schaltflächen auf denselben Abschluss, sodass alle „9“ ausgeben, unabhängig davon, auf welche Schaltfläche geklickt wird.
Auflösen des Problem
Um dieses Problem zu beheben, können wir „i“ als Schlüsselwortargument mit einem Standardwert übergeben. Dadurch wird eine neue Bindung für „i“ im Namespace der Lambda-Funktion eingeführt, die sie unabhängig von „i“ in __init__() macht.
Lösung mit Schlüsselwortargument:
self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))
Lösung mit functools.partial:
Ein anderer Ansatz ist die Verwendung von functools.partial, wodurch eine Teilfunktion mit vorgebundenen Argumenten erstellt wird. Dadurch wird der Code besser lesbar und die Verwendung von Schlüsselwortargumenten entfällt.
self._numberButtons[i].clicked.connect(partial(self._number, i))
Durch die Implementierung dieser Lösungen gibt jede Schaltfläche beim Klicken die vorgesehene Zahl aus.
Das obige ist der detaillierte Inhalt vonWarum drucken alle meine Taschenrechnertasten dieselbe Zahl, wenn sie in PyQt4 in einer Schleife verbunden sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!