2016-04-16 6 views
1

Ich möchte eine Funktion ausführen, die Argumente (zum Beispiel my_func(int, str, int)) wenn ein QtGui.QPushButton geklickt wird. Der folgende CodeQtGui.QPushButton.clicked.connect() mit Funktion, die Argumente übernimmt

my_btn = QtGui.QPushButton() 
my_btn.clicked.connect(my_func(my_int, my_str, my_second_int)) 

erzeugt folgende Runtime: Failed to connect signal clicked().

Wie kann ich das erreichen?

+1

'my_btn.clicked.connect (lambda: my_func (mein_int, mein_str, mein_second_int))'. – ekhumoro

Antwort

2

Wenn connect verwenden, nur Sie die aufrufbare Funktion

my_btn.clicked.connect(my_func) 

In Ihrem Beispiel passieren, sind Sie Aufruf tatsächlich die my_func Funktion vor dem Verbindungscode wird immer ausgeführt. Es versucht also, den von my_func zurückgegebenen Wert zu verbinden, und es funktioniert nicht.

Was Sie tun möchten, ist eine partial-Funktion zu erstellen, die eine Funktion ist, die bereits einige oder alle Funktionsargumente vorausgefüllt hat. Python hat eine Funktion in der Standard-Bibliothek, die diese functools.partial

from functools import partial 

my_btn.clicked.connect(partial(my_func, my_int, my_str, my_second_int)) 

Dies schafft eine Teil Funktion aufgerufen tun kann, die my_func mit den Positionsargumenten my_int, my_str und my_second_int, und dass Teilfunktion verbunden ist, rufen wird die Taste clicked Signal.

+0

Ich akzeptierte diese Antwort, weil sie eine Erklärung enthält, warum das, was ich tat, nicht funktionierte, aber ich denke, dass Ekhumoros Lösung einfacher ist. – derNincompoop

Verwandte Themen