„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum gibt mein PyQt4-Tastenklicksignal innerhalb einer Schleife immer denselben Wert aus?

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

Veröffentlicht am 16.11.2024
Durchsuche:744

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. Beim Versuch, mehrere von Schaltflächen ausgegebene Signale innerhalb einer Schleife zu verbinden, kann es jedoch 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 eine der Schaltflächen zeigt die Ausgabe stets „9“ an, unabhängig davon, welche Schaltfläche gedrückt wurde. Um den Grund für dieses Verhalten zu verstehen, müssen Sie die Feinheiten der Bereichsregeln von Python untersuchen.

In Python wird der Bereich 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 denselben 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 jedes eine separate Bindung von „i“ erstellt wird Instanz.

self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))

Alternativ kann functools.partial verwendet werden, um eine zu erstellen Spezialfunktion, die „i“ an den jeweils zugeordneten spezifischen Wert bindet button.

self._numberButtons[i].clicked.connect(partial(self._number, i))

Diese Änderungen garantieren, dass jede Rückruffunktion den korrekten Wert von „i“ erfasst. Ermöglichung angemessener Reaktionen auf Schaltflächenklicks.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3