Heim > Backend-Entwicklung > Python-Tutorial > Warum gibt mein PyQt4-Tastenklicksignal innerhalb einer Schleife immer denselben Wert aus?

Warum gibt mein PyQt4-Tastenklicksignal innerhalb einer Schleife immer denselben Wert aus?

DDD
Freigeben: 2024-11-13 04:08:09
Original
731 Leute haben es durchsucht

Why Does My PyQt4 Button Clicked Signal Always Output the Same Value Within a Loop?

Slots und Signale in PyQt4 innerhalb einer Schleife verbinden

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)
Nach dem Login kopieren

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))
Nach dem Login kopieren

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))
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage