如何禁用Qpushqt按钮?

2024-10-01 07:28:27 发布

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

当我按下按钮时,会运行一些耗时的代码。当它运行时,我想避免按钮响应任何进一步的点击。代码完成后,可以重新启用该按钮,并应处理进一步的单击。在

我试着用:

   self.btn.blockSignals(True)
   self.btn.setEnabled(False)
   ... code ...
   self.btn.blockSignals(True)
   self.btn.setEnabled(False)

但是,如果我快速点击这个按钮10次,代码将被执行10次。。。在

实际上,我会将耗时的代码转移到另一个线程。(编辑:但问题仍然是一样的-我认为??。事实上解决了这个问题。见accepted answer。)

如何阻止或忽略某个按钮在运行时的单击?在

以下是我的代码的最低版本:

^{pr2}$

Tags: 代码answerselffalsetrue编辑code线程
1条回答
网友
1楼 · 发布于 2024-10-01 07:28:27

如果将长时间运行的代码放在线程中,一旦线程启动,控件就可以返回到主事件循环,这将允许gui立即更新。在

以下是基于您的示例的基本演示:

import sys
from PyQt4 import QtGui, QtCore

class Thread(QtCore.QThread):
    def run(self):
        QtCore.QThread.sleep(2)

class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        grid = QtGui.QGridLayout()
        self.setLayout(grid)
        self.btn = QtGui.QPushButton('Count')
        grid.addWidget(self.btn, 1, 1)
        self.txt1 = QtGui.QTextEdit()
        grid.addWidget(self.txt1, 1, 2)
        self.btn.clicked.connect(self.click)
        self.thread = Thread()
        self.thread.finished.connect(lambda: self.btn.setEnabled(True))
        self.show()

    def click(self):
        self.txt1.append('click')
        if not self.thread.isRunning():
            self.btn.setEnabled(False)
            self.thread.start()

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

相关问题 更多 >