Heim >Backend-Entwicklung >Python-Tutorial >Warum drucken alle meine Taschenrechnertasten dieselbe Zahl, wenn sie in PyQt4 in einer Schleife verbunden sind?

Warum drucken alle meine Taschenrechnertasten dieselbe Zahl, wenn sie in PyQt4 in einer Schleife verbunden sind?

Linda Hamilton
Linda HamiltonOriginal
2024-11-13 02:22:02497Durchsuche

Why Do All My Calculator Buttons Print the Same Number When Connected in a Loop in PyQt4?

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!

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