我将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
答案 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()
会引发异常。