PyQt bietet verschiedene Signal- und Slot-Mechanismen für die Kommunikation zwischen Objekten. Signale werden ausgegeben, um Zuhörer über Ereignisse zu benachrichtigen, während Slots Methoden sind, die ausgeführt werden, wenn Signale empfangen werden. Ein häufiger Anwendungsfall ist die Weitergabe von Daten von Signalen an Slots. Was aber, wenn Sie zusammen mit dem Signal zusätzliche Daten senden möchten? In diesem Artikel untersuchen wir, wie man mithilfe von Lambda-Funktionen und functools.partial zusätzliche Argumente durch Signale weiterleitet.
In Python sind Lambda-Funktionen anonyme Funktionen, die dies können inline definiert werden. Sie bieten eine bequeme Möglichkeit, zusätzliche Argumente an einen Slot zu übergeben, ohne die Definition des Slots zu ändern. Die Syntax lautet wie folgt:
signal.connect(lambda param1, param2, ..., arg1=val1, arg2=value2, ... : fun(param1, param2,... , arg1, arg2, ....))
wobei:
Bedenken Sie beispielsweise Folgendes Code:
def addLineEdit(self): self.buttonGroup.buttonClicked['int'].connect(lambda i: self.input(i, "text")) @pyqtSlot(int) def input(self, button_or_id, DiffP): if isinstance(button_or_id, int): if button_or_id == 0: self.TotalInput[0].setText(DiffP) elif button_or_id == 1: self.TotalInput[54].setText('1')
In diesem Beispiel wird das buttonClicked-Signal mithilfe einer Lambda-Funktion, die das zusätzliche Argument „text“ übergibt, mit einem Slot (Eingabe) verbunden. Der Eingabeslot verwendet dann das DiffP-Argument, um das TotalInput-Widget zu ändern.
Ein weiterer Ansatz zur Übergabe zusätzlicher Argumente über Signale ist die Verwendung von functools.partial. Diese Funktion erstellt eine neue Funktion, in der eine Teilmenge der Argumente der ursprünglichen Funktion bereits ausgefüllt ist. Die Syntax lautet wie folgt:
signal.connect(partial(fun, args1, arg2, ... ))
wobei:
Betrachten Sie beispielsweise den folgenden Code:
from functools import partial self.buttonGroup.buttonClicked['int'].connect(partial(self.input, "text")) @pyqtSlot(int) def input(self, DiffP, button_or_id): if isinstance(button_or_id, int): if button_or_id == 0: self.TotalInput[0].setText(DiffP) elif button_or_id == 1: self.TotalInput[54].setText('1')
In diesem Beispiel wird functools.partial verwendet, um eine neue Funktion zu erstellen, an die bereits das Argument „text“ gebunden ist . Wenn das buttonClicked-Signal ausgegeben wird, wird der Eingabeslot mit dem DiffP-Argument und dem zuvor übergebenen „Text“-Argument aufgerufen.
Das Übergeben zusätzlicher Argumente über Signale kann eine nützliche Technik in PyQt sein Entwicklung. Es ermöglicht die Übertragung zusätzlicher Daten zusammen mit dem Signal und bereichert so die Kommunikation zwischen Objekten. Wenn Sie die Verwendung von Lambda-Funktionen und functools.partial verstehen, können Sie diese Funktion effektiv in Ihren PyQt-Anwendungen nutzen.
Das obige ist der detaillierte Inhalt vonWie kann ich zusätzliche Argumente durch Signale in PyQt übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!