gpt4 book ai didi

python - 单击 QPushButton 时,它会触发两次

转载 作者:太空宇宙 更新时间:2023-11-04 00:28:06 25 4
gpt4 key购买 nike

我在一个项目中使用了 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 协议(protocol)并将其发送到套接字服务器。但是,每次点击都会调用 wireup 函数两次。 (由于调试打印命令,我确信这一点)。我程序中的发送函数中没有其他调用。

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

我使用 QtDesigner 创建 UI 并在我的 main.py 中加载了 .uic

最佳答案

每次你从socket接收到任何东西

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

关于python - 单击 QPushButton 时,它会触发两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46747317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com