Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在QListWidget中处理数千项并减少延迟_Python_Pyqt_Pyqt5_Qlistwidget - Fatal编程技术网

Python 在QListWidget中处理数千项并减少延迟

Python 在QListWidget中处理数千项并减少延迟,python,pyqt,pyqt5,qlistwidget,Python,Pyqt,Pyqt5,Qlistwidget,我有QListWidget和一个字典,我正在使用for循环遍历它。for循环的每次迭代都会向QListWidget中添加一个项,以及附加到每个项的一些按钮和标签。一切正常,但我有一个问题,就是每次刷新列表都要花很长时间(1k个项目大约20秒)才能加载列表。在此期间,GUI是完全不负责任的(只要不花太长时间,我就可以接受)。我发现的一个解决方案是,如果在QMainWindow进行迭代时隐藏(self.hide())QMainWindow,然后在完成后显示(self.show())它(1k个项目大约

我有QListWidget和一个字典,我正在使用for循环遍历它。for循环的每次迭代都会向QListWidget中添加一个项,以及附加到每个项的一些按钮和标签。一切正常,但我有一个问题,就是每次刷新列表都要花很长时间(1k个项目大约20秒)才能加载列表。在此期间,GUI是完全不负责任的(只要不花太长时间,我就可以接受)。我发现的一个解决方案是,如果在QMainWindow进行迭代时隐藏(
self.hide()
)QMainWindow,然后在完成后显示(
self.show()
)它(1k个项目大约1.5秒),则刷新时间会显著缩短,因此我假设这是资源问题。是否有可能在保持GUI可见(且不负责任)的同时获得大约1.5秒的刷新时间,方法是冻结GUI,以便在刷新列表时不会占用太多资源

示例代码:

导入系统 导入时间 从PyQt5.QtWidgets导入QApplication、QMainWindow、QListWidget、QListWidgetItem、QPushButton、QVBoxLayout、QWidget 类窗口(QMainWindow): 定义初始化(自): 超级(窗口,自我)。\uuuu初始化 self.show() 自设置固定大小(800500) self.listwidget() self.refreshlist() def listwidget(自身): self.list=QListWidget(self) self.list.setFixedSize(800500) self.list.show() def refreshlist(self):#取消对self.hide()和self.show()的注释,以查看速度有多快 开始=时间。时间() #self.hide() 对于范围(1000)内的i: item=QListWidgetItem(str(i)) self.list.addItem(项目) widget=QWidget(self.list) 布局=QVBoxLayout(小部件) layout.addWidget(QPushButton()) self.list.setItemWidget(项,小部件) #self.show() 打印(f“耗时{time.time()-start}秒”) """ 隐藏和显示的平均时间为0.3秒 没有隐藏和显示的平均时间为14秒 """ 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app=QApplication([]) Gui=window() sys.exit(app.exec_())
最初的问题是,当它显示时,然后每次添加项目(和小部件)时,它都会重新绘制所有内容,这与隐藏它并在只有一幅画的地方显示它的任务不同

另一种不减少加载时间但确实使GUI可见的方法是使用队列和计时器每隔T秒添加项目块。您还可以添加gif,向用户指示正在加载信息

从集合导入数据
从functools导入缓存的_属性
导入系统
从PyQt5.QtCore导入pyqtSignal,QTimer
从PyQt5.QtGui导入QMovie
从PyQt5.QtWidgets导入(
QApplication,
QMainWindow,
QLabel,
QListWidget,
QListWidgetItem,
QPushButton,
QStackedWidget,
QVBoxLayout,
QWidget,
)
类ListWidget(QListWidget):
started=pyqtSignal()
finished=pyqtSignal()
区块=50
间隔=0
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.timer.timeout.connect(self.handle\u超时)
@缓存的不动产
def队列(自我):
返回deque()
@缓存的不动产
def定时器(自):
返回QTimer(间隔=自间隔)
def fillData(自我,数据):
self.started.emit()
self.queue.clear()
self.queue.extend(数据)
self.timer.start()
def句柄_超时(自身):
对于范围内的i(self.CHUNK):
如果self.queue:
value=self.queue.popleft()
自行创建项目(str(值))
其他:
self.timer.stop()
self.finished.emit()
打破
def创建_项(自身,文本):
item=QListWidgetItem(文本)
自我添加项(项目)
widget=QWidget()
布局=QVBoxLayout(小部件)
按钮=QPushButton(文本)
layout.addWidget(按钮)
layout.setContentsMargins(0,0,0,0)
self.setItemWidget(项目,小部件)
类窗口(QMainWindow):
定义初始化(自):
超级(窗口,自我)。\uuuu初始化
自设置固定大小(800500)
self.setCentralWidget(self.stackedWidget)
self.stackedWidget.addWidget(self.gifLabel)
self.stackedWidget.addWidget(self.listWidget)
self.listWidget.started.connect(self.handle\u listWidget\u started)
self.listWidget.finished.connect(self.handle\u listWidget\u finished)
@缓存的不动产
def stackedWidget(自身):
返回QStackedWidget()
@缓存的不动产
def listWidget(自身):
返回ListWidget()
@缓存的不动产
def标签(自我):
label=QLabel(scaledContents=True)
movie=QMovie(“loading.gif”)
label.setMovie(电影)
退货标签
def handle_listwidget_已启动(自):
self.gifLabel.movie().start()文件
self.stackedWidget.setCurrentIndex(0)
def handle_listwidget_finished(self):
self.gifLabel.movie().stop())
self.stackedWidget.setCurrentIndex(1)
如果名称=“\uuuuu main\uuuuuuuu”:
app=QApplication([])
w=窗口()
w、 show()
w、 listWidget.fillData(范围(1000))
sys.exit(app.exec_())

最初的问题是,当它显示时,然后每次添加项目(和小部件)时,它都会重新绘制所有内容,这与隐藏它并在只有一幅画的地方显示它的任务不同

另一种不减少加载时间但确实使GUI可见的方法是使用队列和计时器每隔T秒添加项目块。您还可以添加gif,向用户指示正在加载信息

从集合导入数据
从functools导入缓存的_属性
导入系统
来自PyQt5。