单击QPushButton时,会触发两次

时间:2017-10-14 17:21:53

标签: python pyqt5 qt-designer qpushbutton

我将PyQt5用于项目,并使用以下代码段(button是QPushButton)

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")

on_receive函数连接到soccet客户端,无论何时收到数据包,都会调用它。布局有点复杂,因为我的UI有很多按钮,它们更容易迭代它们而不是硬编码每一个。

每当我点击按钮时,连线功能都会将按钮连接到upvote功能,这会创建一个json protocl并将其发送到套接字服务器。但是,每次点击都会将连线功能称为两次。 (由于调试打印命令,我确信这一点)。在我的程序中,send函数中没有其他调用。

我推测这可能是由于clicked.connect的工作原理(也许是在点击发布时触发)。

我使用QtDesigner创建了用户界面并在.uic

中加载了main.py

1 个答案:

答案 0 :(得分:2)

每次从套接字接收任何内容时都会执行

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

并在self.wire_up_button中连接按钮点击事件。请注意,self.buttonArray始终是相同的按钮列表,因此每次调用on_receive时,您都会为每个按钮点击添加1个新订阅。但之前订阅按钮点击仍然存在,因此点击按钮upvote将多次使用不同的sid进行调用。在添加新按钮之前,您需要断开与按钮单击事件的连接:

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阻止是必需的,因为如果没有任何函数连接到click事件,button.clicked.disconnect()会引发异常。