单击 QPushButton 时,它会触发两次
When a QPushButton is clicked, it fires twice
我在一个项目中使用了 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 有太多按钮,迭代它们比对每个按钮都进行硬编码更方便。
每当我点击按钮时,连接功能将按钮连接到投票功能,该功能创建一个 json 协议并将其发送到套接字服务器。但是,每次点击都会调用 wireup 函数 两次 。 (由于调试打印命令,我确信这一点)。我程序中的发送函数没有其他调用。
我推测这可能是由于 clicked.connect 的工作原理(可能是在单击 和 释放时触发)。
我使用 QtDesigner 创建了 UI 并在我的 main.py
中加载了 .uic
每次你从套接字收到任何东西时你都会做
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
块是必需的,因为如果没有函数连接到单击事件,button.clicked.disconnect()
会引发异常。
我在一个项目中使用了 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 有太多按钮,迭代它们比对每个按钮都进行硬编码更方便。
每当我点击按钮时,连接功能将按钮连接到投票功能,该功能创建一个 json 协议并将其发送到套接字服务器。但是,每次点击都会调用 wireup 函数 两次 。 (由于调试打印命令,我确信这一点)。我程序中的发送函数没有其他调用。
我推测这可能是由于 clicked.connect 的工作原理(可能是在单击 和 释放时触发)。
我使用 QtDesigner 创建了 UI 并在我的 main.py
.uic
每次你从套接字收到任何东西时你都会做
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
块是必需的,因为如果没有函数连接到单击事件,button.clicked.disconnect()
会引发异常。