Wie verbinde ich Slots und Signale dynamisch in PyQt4 ohne unerwartetes Verhalten?

DDD
Freigeben: 2024-11-11 19:50:03
Original
790 Leute haben es durchsucht

How to Connect Slots and Signals Dynamically in PyQt4 Without Unexpected Behavior?

Slots und Signale dynamisch in PyQt4 verbinden

In PyQt4 kann das programmgesteuerte Verbinden mehrerer Slots mit Signalen zu unerwartetem Verhalten führen, wenn dies innerhalb einer Schleife erfolgt .

Problem:

Erwägen Sie die Erstellung eines Taschenrechners mit dynamisch generierten Zahlentasten innerhalb einer Schleife. Wenn das Signal „clicked()“ jeder Schaltfläche wie folgt verbunden ist:

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

Problem:

Wenn auf eine Schaltfläche geklickt wird, wird auf allen Schaltflächen „9“ gedruckt '. Dieses Verhalten ergibt sich aus der Scoping- und Abschlusssemantik von Python. Der Lambda-Ausdruck verweist auf die Variable i, die innerhalb der Schleife den Endwert „9“ ergibt.

Lösung:

Um dieses Problem zu vermeiden, übergeben Sie i als Schlüsselwortargument mit einem Standardwert:

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

Alternativ können Sie functools.partial für einen saubereren Ansatz verwenden:

self._numberButtons[i].clicked.connect(partial(self._number, i))
Nach dem Login kopieren

Diese Lösungen isolieren i innerhalb des Lambda-Ausdrucks und stellen so sicher, dass jeder Die Schaltfläche löst beim Klicken die beabsichtigte Aktion aus.

Das obige ist der detaillierte Inhalt vonWie verbinde ich Slots und Signale dynamisch in PyQt4 ohne unerwartetes Verhalten?. 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