【问题标题】:When a QPushButton is clicked, it fires twice单击 QPushButton 时,它会触发两次
【发布时间】:2018-03-26 14:48:45
【问题描述】:

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

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

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

【问题讨论】:

  • 拜托,您能否添加更多上下文,例如connect 信号线的位置?通过看到songid,它似乎在一个函数中
  • @PRMoureu 我已经这样做了,它可能会混淆那里发生的事情。我尽我所能使它尽可能可读...
  • 是否使用相同的 sid 调用 upvote()?你确定你不会为同一个按钮调用两次wire_up_button吗?
  • 它可以在wire_up_button 内使用try: button.clicked.disconnect() except Exception: pass(在.clicked.connect 之前)吗?

标签: python pyqt5 qt-designer qpushbutton


【解决方案1】:

每次你从套接字收到任何东西时,你都会这样做

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

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 2010-09-27
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多