2017-10-18 2 views
0

버튼을 누르면 시간이 오래 걸리는 코드가 실행됩니다. 실행중인 동안 버튼이 더 이상 클릭에 응답하지 않도록하고 싶습니다. 코드가 완료되면 버튼을 다시 활성화 할 수 있으며 추가 클릭이 처리되어야합니다. 내가 사용하는 것이 할 노력하고있어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_()) 
+0

하지만 다음 링크를 발견 : 여기

이 기본 데모 귀하의 예제를 기반으로 [링크] (https://stackoverflow.com/questions/14087066/disabling -qpushbutton-before-a-task) 아마도'self.btn.setEnabled (False)'아래에 QCoreApplication :: processEvents()를 추가해야 할 것입니다. – Spezi94

+0

내 시스템에서'processEvents'는 작동하지 않지만 스레드는 작동합니다. – ekhumoro

+0

@ekhumoro 당신은 코드를 새 스레드로 옮기는 것을 의미합니까? 신호를 (False) 차단해야합니까 스레드로 너무 이동해야합니까? – Raf

답변

1

는, 컨트롤이 메인 이벤트 루프로 반환 할 수 있도록 : 여기

내 코드의 최소 버전입니다 GUI를 즉시 업데이트하십시오. 내가 PyQt는 익숙하지 않다

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_()) 
+0

훌륭해, 고마워! 이 중요한 개념을 놓치고있었습니다. 시간이 많이 걸리는 작업으로 메인 이벤트 루프를 차단하지 마십시오. – Raf

관련 문제