Вы не должны использовать sleep () в главном потоке, поскольку он блокирует цикл событий GUI, если вы хотите выполнять периодические задачи, вам следует использовать QTImer.
На основании вышеизложенного решение:
from PyQt4 import QtCore, QtGui
class Timer(QtCore.QObject):
timeout = QtCore.pyqtSignal(int)
finished = QtCore.pyqtSignal()
def __init__(self, parent=None, **kwargs):
self._maximum = kwargs.pop("maximum", 0)
_interval = kwargs.pop("interval", 0)
_timeout = kwargs.pop("timeout", None)
_finished = kwargs.pop("finished", None)
if parent is not None:
kwargs["parent"] = parent
super(Timer, self).__init__(**kwargs)
self._counter = 0
self._timer = QtCore.QTimer(timeout=self._on_timeout)
self.interval = _interval
if _timeout:
self.timeout.connect(_timeout)
if _finished:
self.timeout.connect(_finished)
@QtCore.pyqtSlot()
def start(self):
self._timer.start()
@property
def interval(self):
return self._timer.interval()
@interval.setter
def interval(self, v):
self._timer.setInterval(v)
@property
def maximum(self):
return self._maximum
@maximum.setter
def maximum(self, v):
self._maximum = v
@QtCore.pyqtSlot()
def _on_timeout(self):
self.timeout.emit(self._counter)
self._counter += 1
if self._counter >= self.maximum:
self.finished.emit()
self._timer.stop()
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.m_listwidget = QtGui.QListWidget()
self.setCentralWidget(self.m_listwidget)
t = Timer(self, maximum=500, interval=1000, timeout=self.onTimeout)
t.start()
@QtCore.pyqtSlot(int)
def onTimeout(self, i):
self.m_listwidget.addItem(str(i))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())