If you are performing long operation, you need either move it to separate thread or call QApplication::processEvents()
periodically. It allows GUI to remain responsible. Here is a simple example:
from PySide import QtGui, QtCore
import time
class MyWidget(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
layout = QtGui.QVBoxLayout(self)
self.label = QtGui.QLabel()
self.button_start = QtGui.QPushButton("Start")
self.button_stop = QtGui.QPushButton("Stop")
self.button_stop.setEnabled(False)
self.button_pause = QtGui.QPushButton("Pause")
self.button_pause.setEnabled(False)
layout.addWidget(self.label)
layout.addWidget(self.button_start)
layout.addWidget(self.button_stop)
layout.addWidget(self.button_pause)
self.button_start.clicked.connect(self.processing)
self.button_pause.clicked.connect(self.pause)
self.button_stop.clicked.connect(self.stop)
def processing(self):
self.button_start.setEnabled(False)
self.button_stop.setEnabled(True)
self.button_pause.setEnabled(True)
self.stop_requested = False
self.paused = False
i = 0
while not self.stop_requested:
QtGui.QApplication.processEvents()
if self.paused:
time.sleep(0.1)
else:
i += 1
self.label.setText(unicode(i))
self.button_start.setEnabled(True)
self.button_stop.setEnabled(False)
self.button_pause.setEnabled(False)
def pause(self):
self.paused = not self.paused
def stop(self):
self.stop_requested = True
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec_())