python - 函数在 500 次迭代后打印 500 个值 函数将值更新到列表小部件
问题描述
如何在每次迭代时更新列表小部件?它在 500 次迭代后更新 listwidget。pyqt4、python3.7
def input_val(self):
for i in range(500):
time.sleep(1)
self.listWidget.addItem(str(i))
print(i)
解决方案
您不应该在主线程中使用 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_())
推荐阅读
- c++ - 使用 GCC/ICC 在 C++ 中使用模板参数展开可移植循环
- typescript - 打字稿中有没有办法确保传递给更高阶的函数具有特定的返回类型?
- google-apps-script - Google Apps 脚本成功处理程序从服务器函数接收“null”,即使它具有值服务器端
- reactjs - 部署创建反应应用程序时主页出现问题
- vue.js - Axios:从 UI 触发取消拦截器请求
- office-js - Excel JS API - 将精确范围值、格式和公式复制并存储在 json 文件中,以供以后生成相同范围的值
- express - 如何从 Internet Explorer 无缝重定向到 Microsoft Edge?
- python - 为什么菜单不显示?- Tkinter
- xml - XSLT 基于包含元素的属性值分解 XML 文本在 TEI 中不起作用
- python-2.7 - file.write 仅对一个元素返回无效语法