버튼을 누르면 시간이 오래 걸리는 코드가 실행됩니다. 실행중인 동안 버튼이 더 이상 클릭에 응답하지 않도록하고 싶습니다. 코드가 완료되면 버튼을 다시 활성화 할 수 있으며 추가 클릭이 처리되어야합니다. 내가 사용하는 것이 할 노력하고있어pyqt : QPushButton에 대해 여러 번의 클릭을 사용 중지하는 방법은 무엇입니까?
:
self.btn.blockSignals(True)
self.btn.setEnabled(False)
... code ...
self.btn.blockSignals(True)
self.btn.setEnabled(False)
그러나이 여전히 나는 빠른 속도로이 버튼을 10 번 클릭하면 코드가 10 번 실행됩니다 ... 현실에서
나 ' 시간이 많이 걸리는 코드를 다른 스레드로 이동하십시오. (. 편집 : 하지만 여전히 문제는 동일합니다 - 내가? 생각을 해결 현실에서accepted answer를 참조하십시오.).
뭔가가 실행되는 동안 어떻게 버튼에 클릭을 차단하거나 무시합니까? 당신이 스레드에서 장기 실행 해 코드를 삽입하면 스레드가 시작되면
import time
import sys
from PyQt4 import QtGui
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.count = 0
self.show()
def click(self):
# Here I want to block any further click in the button, but it is
# not working - clicking it 10 times quickly will run this 10 times...
self.btn.blockSignals(True)
self.btn.setEnabled(False)
time.sleep(2) # time consuming code...
self.count += 1
self.txt1.append(str(self.count))
self.repaint()
self.btn.setEnabled(True)
self.btn.blockSignals(False)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
하지만 다음 링크를 발견 : 여기
이 기본 데모 귀하의 예제를 기반으로 [링크] (https://stackoverflow.com/questions/14087066/disabling -qpushbutton-before-a-task) 아마도'self.btn.setEnabled (False)'아래에 QCoreApplication :: processEvents()를 추가해야 할 것입니다. – Spezi94내 시스템에서'processEvents'는 작동하지 않지만 스레드는 작동합니다. – ekhumoro
@ekhumoro 당신은 코드를 새 스레드로 옮기는 것을 의미합니까? 신호를 (False) 차단해야합니까 스레드로 너무 이동해야합니까? – Raf