2016-11-09 3 views
1

Ich habe ein Worker-Objekt, das viele Funktionen hat und ich möchte sie für einen zusätzlichen Thread verwenden. Also folgte ich this Antwort und es funktioniert, wenn ich eine feste Anzahl von Argumenten an die Funktionen übergeben, mehr oder weniger wie folgt aus:Objekt mit mehreren Funktionen mit optionalen Argumenten in einem anderen Thread

_signalCommand = QtCore.pyqtSignal(str, str) 
    self._signalCommand.connect(self.nanomax.test) 
    self._signalCommand.emit('testA', 'testB') 

Aber in meinem Fall habe ich keine feste Anzahl von Argumenten verwenden können. Ich brauche optional diejenigen, meine Funktionen sind wie folgt aus:

def test(self, test1='test1', test2='test2'): 
    print test1 
    print test2 

Also, um zu beheben, dass ich Lambda wurde mit, wie folgt aus:

_signalCommand = QtCore.pyqtSignal() 
    self._signalCommand.connect(lambda: self.nanomax.test('testA', 'testB') 
    self._signalCommand.emit() 

diese Art und Weise, in der Tat, meine optionalen Argumente beheben Probleme, aber es macht das Objekt im Haupt-Thread ausgeführt. Ich denke, das liegt daran, dass Lambda eine andere Funktion erzeugt und es ist, als würde man den Arbeiter direkt anrufen (self.nanomax.test('testA', 'testB'), wie in der Antwort erwähnt, die ich zuvor geteilt habe.

Gibt es trotzdem, um dies zu vermeiden? Vielen Dank im Voraus.

+0

Im Fall, dass Sie beschreiben, wo Sie zwei optionale Argumente haben, und Sie kennen ihren Wert im voraus, ich sehe kein Problem . Erstellen Sie einfach ein Signal '_signalCommand = QtCore.pyqtSignal()' und ein anderes '_signalCommand2 = QtCore.pyqtSignal (str, str)' verbinden Sie beide und senden Sie je nachdem, was Sie möchten, abhängig davon, ob Sie die Standardwerte verwenden möchten oder nicht. – ImportanceOfBeingErnest

+0

Die Sache ist, dass ich in meinem Programm alle optionalen Argumente bekommen muss, die von einer Liste kommen. Diese Liste würde mir eine beliebige Anzahl von Parametern mit beliebigen Werten bringen. – Eduardo

Antwort

0

könnten Sie wahrscheinlich teilweise verwenden für dieses

zB:

from functools import partial 
... 

_signalCommand = QtCore.pyqtSignal() 
    self._signalCommand.connect(partial(self.nanomax.test, 'testA', 'testB')) 
    self._signalCommand.emit() 
+0

Danke, es scheint, es funktioniert, aber das einzige Problem ist, dass ich die Listenwerte nicht mit dem Entpacker wie folgt übergeben kann: 'self._signalCommand.connect (partiell (self.nanomax.test, * self.arg [1 :])) ', gibt es einen anderen Weg, das zu tun? Pass so viele Argumente wie die Liste geht? – Eduardo

Verwandte Themen