2012-04-04 11 views
1

Ich habe ein Wörterbuch, dessen Schlüssel die Namen aller Wählscheiben in meiner PyQT-Schnittstelle sind. Die Werte, die diesen Tasten zugeordnet sind, sind bestimmte numerische Werte, die jeder Wählscheibe zugeordnet sind, die an eine Handler-Funktion übergeben werden müssen (um festzustellen, welche Wählscheibe bewegt wurde), zusammen mit dem neuen Wert dieser Wählscheibe.Partiell verwenden, um Steckplätze für Signale mit Rückgabewerten in PyQt zu erstellen

Ich habe functools.partial verwendet, um eine andere Instanz der Handler-Funktion für jeden der numerischen Werte zu erstellen, aber das "valueChanged" -Signal gibt eine ganze Zahl zurück und ich bin mir nicht sicher, wie ich es an die partielle Funktion übergeben soll auch. Die folgende nicht zu funktionieren scheint, wie die dialChanged Funktion endet nie aufgerufen wird:

for dial, cc, in dialDict.iteritems(): 
    getattr(self.ui, dial).setRange(0,127) 
    getattr(self.ui, dial).valueChanged.connect(
     lambda value: partial(self.windowHandler.dialChanged, 
           mainWindowInstance=self, 
           cc=cc, 
           value=value)) 

denke ich, das Problem hat mit der Verwendung der Lambda-Funktion innerhalb der for-Schleife und Umfang zu tun, aber ich Ich bin mir nicht sicher, wie ich sonst den Rückgabewert des Signals valueChanged in den von partially erzeugten Slot überführen könnte. Irgendwelche Vorschläge würden geschätzt werden.

+1

Was ist die Signatur von 'dialChanged'? –

Antwort

2

Ich glaube tatsächlich, es Sinn macht, hier teilweise zu nutzen, und das Lambda-Graben, aber Ihre dialChanged Handler haben einen Rückruf freundliche Unterschrift zu machen:

# where ever this is defined 
def dialChanged(value, mainWindowInstance=None, cc=None): 
    pass 

cbk = partial(
    self.windowHandler.dialChanged, 
    mainWindowInstance=self, 
    cc=cc) 

.valueChanged.connect(cbk) 

Der Schlitz mit einem Wert aufgerufen werden soll arg, also sollte das mit der Signatur übereinstimmen, die ich denke. Das Lambda ist nur dann notwendig, wenn Sie die DialChanged-Slot-Funktion nicht kontrollieren können und Sie die Signatur komplett neu formatieren müssen, indem Sie den Aufruf umschließen.

+0

Großartig! Das funktioniert perfekt. Vielen Dank! – Bitrex

+3

@Bitrex: Meine Erfahrung mit PyQt bis heute ist, dass teilweise fast immer meine Callback-Bedürfnisse löst. Ich benutze nie Lambdas für die Rückrufe. – jdi

Verwandte Themen