2017-10-14 1 views
1

ich PyQt5 für ein Projekt verwendet und haben folgende Schnipsel (button ist ein QPushButton)Wenn ein QPushButton geklickt wird, es feuert zweimal

def on_receive(self, query): 
    print("receiving", query) 
    datapackages = json.loads(query) 

    for button, datapackage in zip(self.buttonArray, datapackages): 
     self.wire_up_button(datapackage, button) 

def wire_up_button(self, datapackage, button): 
    title, songid = datapackage["title"], datapackage["songid"] 
    button.setText(title + " (" + str(datapackage["votes"]) + ")") 
    button.clicked.connect(lambda: self.upvote(songid)) 

def upvote(self, sid): 
    text = '{"action":"upvote", "value":"' + sid + '"}\n' 
    print(text) 
    self.send(text) 

def send(self, text): 
    print("Sending") 

Die on_receive Funktion zu einem soccet Client verbunden ist und wird aufgerufen wheneever Ein Datenpaket wird empfangen. Das Layout ist ein bisschen kompliziert, weil meine UI so viele Knöpfe hat, dass es einfacher ist, über sie zu iterieren, als jeden einzelnen hart zu kodieren.

Immer wenn ich auf die Schaltfläche klicke, verdrahtet die Wire-Up-Funktion die Schaltfläche zur Upvote-Funktion, die ein Json-Protokoll erstellt und an den Socket-Server sendet. Die Wire-Up-Funktion wird jedoch zweimal pro Klick genannt. (Ich bin mir wegen der Debug-Druckbefehle sicher). Es gibt keinen anderen Aufruf in der Sendefunktion in meinem Programm.

Ich spekuliere, dass dies möglicherweise darauf zurückzuführen ist, wie click.connect funktioniert (vielleicht löst es bei Klick und Release).

verwendete ich die QtDesigner die Benutzeroberfläche zu erstellen und lud die .uic in meinem main.py

+0

bitte, könnten Sie mehr Kontext hinzufügen, wie wo ist die 'connect'-Signallinie? wenn ich 'songid' sehe, scheint es in einer Funktion zu sein – PRMoureu

+1

@PRMoureu Ich habe es getan, es könnte verschleiern, was dort vor sich geht. Ich habe mein bestes versucht, um es so leserlich wie möglich zu machen ... – Narusan

+1

wird upvote() mit der gleichen sid aufgerufen? Bist du sicher, dass du wire_up_button nicht zweimal für denselben Button aufruft? – ingvar

Antwort

1

Jedes Mal, wenn Sie etwas aus der Steckdose erhalten Sie tun

for button, datapackage in zip(self.buttonArray, datapackages): 
    self.wire_up_button(datapackage, button) 

und in self.wire_up_button Sie Schaltfläche geklickt Ereignis verbinden. Beachten Sie, dass self.buttonArray immer die gleiche Liste von Schaltflächen ist. Jedes Mal, wenn on_receive aufgerufen wird, fügen Sie jedem Schaltflächenklick ein neues Abonnement hinzu. Aber vorherige Abonnement für Schaltfläche klicken noch vorhanden, so auf Knopfdruck wird mehrmals mit verschiedenen sid aufgerufen werden. Sie müssen von Button-Klick-Ereignis trennen, bevor das Hinzufügen neuer ein:

def wire_up_button(self, datapackage, button): 
    try: 
     button.clicked.disconnect() 
    except: 
     pass 
    title, songid = datapackage["title"], datapackage["songid"] 
    button.setText(title + " (" + str(datapackage["votes"]) + ")") 
    button.clicked.connect(lambda: self.upvote(songid)) 

try ... except Block erforderlich ist, weil button.clicked.disconnect() Ausnahme auslöst, wenn keine Funktionen verbunden waren Ereignis klicken.

Verwandte Themen