2016-11-02 2 views
1

Ich versuche, einige neue QPushButton aus der Liste der Zeilen und dann verbinden sie mit einer Event Handler Function mit connect, aber egal was ich tue, kann ich sie nicht separat an die Funktion anschließen. der Code wie dieseWie übergebe ich einen dynamisch generierten QPushButton an eine SIGNAL-Handler-Funktion in Python?

def addItemButtons(self,chosen): 

    # ----------- DELETE OLD BUTTONS ------------ 
    for i in reversed(range(self.layoutbottom.count())): 
     self.layoutbottom.itemAt(i).widget().setParent(None) 

    # ----------- MAKE A NEW BUTTON FOR EACH CHOSEN ENTRY ----------- 
    for d in chosen: 
     itembtn = QPushButton("ID : "+str(d['id'])) 
     itembtn.clicked.connect(lambda : self.handlerFunction(str(d['id']))) 
     self.layoutbottom.addWidget(itembtn) 

def handlerFunction(self,txt): 
    print(txt) 

, wenn ich auf neue Schaltflächen klicken druckt die handlerFucntion gerade die letzte Taste id!

Ich suchte und verwendete verschiedene Methoden zum Verbinden von Schaltflächen mit HandlerFunction, aber alle waren gleich.

Was mache ich falsch? :/

+1

es in 'for' Schleife mit' lambda' häufiges Problem sein kann, zu tun. 'lambda' ist" faul "- es erhält keinen Wert von' d', wenn Sie 'lambda' definieren, aber wenn Sie diese Funktion ausführen - wenn Sie auf die Schaltfläche klicken. Aber wenn Sie auf die Schaltfläche klicken, wird "d" auf das letzte Element aus der Liste gesetzt - so dass jede Schaltfläche dasselbe "d" - letzte "d" verwendet. Übliche Lösung: 'Lambda x = d ['id']: self.handlerFunction (str (x))'. Es kopiert den Wert von 'd ['id']' nach 'x' und jeder' lambda' verwendet eigenes 'x'. – furas

Antwort

1

Das Problem war, dass der Wert von d['id'] wurde nicht ausgewertet, bis nach der Schleife abgeschlossen war, so während alle Tasten verbunden wurden, nur die letzte id gesendet wurde. Sie müssen sicherstellen, dass der Wert id während der Schleife ausgewertet wird.

können Sie functools.partial verwenden diese

from functools import partial 

for d in chosen: 
    itembtn = QPushButton("ID : "+str(d['id'])) 
    itembtn.clicked.connect(partial(self.handlerFunction, str(d['id']))) 
    self.layoutbottom.addWidget(itembtn) 
1

gut! Ich habe es gelöst, aber ich weiß nicht genau wie! das ist, was ich das Problem zu lösen hat:

 for d in chosen: 
     itembtn = QPushButton("ID : "+str(d['id'])) 
     self.connect(itembtn,SIGNAL('clicked()'),self.handleFunction) 
     self.layoutbottom.addWidget(itembtn) 

und dann änderte ich die handlerFunction dazu:

def handleDriverSelection(self): 
     print (self.sender().text() 

ich die gleiche Sache zuvor aber mit dem diffrence von Tasten verbinden, nachdem alle machen von ihnen und es funktionierte jetzt! vielleicht habe ich da was falsch gemacht. sowieso. Das funktioniert für mich. :)

+0

Sie mussten die Verbindung nicht ändern, um die alte Syntax zu verwenden. Sie könnten diesen Teil zurückschalten, da die Syntax im alten Stil generell nicht empfohlen wird. –

Verwandte Themen