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))
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))
Alternativ können Sie functools.partial für einen saubereren Ansatz verwenden:
self._numberButtons[i].clicked.connect(partial(self._number, i))
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!