Функция выдает 500 значений после 500 итераций. Функция обновляет значения в listwidget. - PullRequest
1 голос
/ 07 июля 2019

как обновить listwidget на каждой итерации? это обновляет список виджетов после 500 итераций. pyqt4, python3.7

def input_val(self):

    for i in range(500):

        time.sleep(1)
        self.listWidget.addItem(str(i))
        print(i)

1 Ответ

1 голос
/ 07 июля 2019

Вы не должны использовать 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_())
...