当QPushButton被点击时,它会触发twi

2024-05-14 16:26:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个项目中使用了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有太多按钮,所以迭代它们比硬编码每个按钮都要方便。在

每当我单击按钮时,wire up函数将按钮连接到upvote函数,后者创建一个json协议并将其发送到socket服务器。但是,每次单击wireup函数会调用两次。(我确信这是因为调试打印命令)。在我的程序中send函数中没有其他调用。在

我推测这可能是由于已单击。连接工作(可能在点击释放时触发)。在

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


Tags: 函数textselfsendtitledefbuttonquery
1条回答
网友
1楼 · 发布于 2024-05-14 16:26:12

每次你从socket收到任何信息

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

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

^{pr2}$

try ... except块是必需的,因为如果没有函数连接到click事件,button.clicked.disconnect()会引发异常。在

相关问题 更多 >

    热门问题