Есть несколько аспектов, которые могут генерировать задержку:
- Изображения весят много, тогда решение состоит в том, чтобы использовать менее тяжелые значки
- У вас есть много изображений, которые повторяются в одном и том же цикле, поэтому возможное решение состоит в том, чтобы дать небольшую задержку, чтобы изображение загружалось постепенно, избегая визуальной задержки, которую вы указываете.
import os
from PySide2 import QtCore, QtGui, QtWidgets
import shiboken2
def for_loop_files(path, interval=100, extensions=(), parent=None, objectName=""):
timer = QtCore.QTimer(parent=parent, singleShot=True, interval=interval)
if objectName:
timer.setObjectName(objectName)
loop = QtCore.QEventLoop(timer)
timer.timeout.connect(loop.quit)
timer.destroyed.connect(loop.quit)
for root, dirs, files in os.walk(path):
for name in files:
base, ext = os.path.splitext(name)
if extensions:
if ext in extensions:
if shiboken2.isValid(timer):
timer.start()
loop.exec_()
yield os.path.join(root, name)
else:
yield os.path.join(root, name)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.list_widget = QtWidgets.QListWidget()
self.list_widget.setViewMode(QtWidgets.QListView.IconMode)
self.list_widget.setIconSize(QtCore.QSize(128, 128))
self.list_widget.setResizeMode(QtWidgets.QListView.Adjust)
self.list_widget.setFlow(QtWidgets.QListView.TopToBottom)
self.setCentralWidget(self.list_widget)
self.resize(640, 480)
QtCore.QTimer.singleShot(0, self.load_icons)
@QtCore.Slot()
def load_icons(self):
for path in for_loop_files(".", extensions=(".png", "jpg"), parent=self, objectName="icon_timer", interval=30):
it = QtWidgets.QListWidgetItem()
it.setIcon(QtGui.QIcon(path))
self.list_widget.addItem(it)
def closeEvent(self, event):
timer = self.findChild(QtCore.QTimer, "icon_timer")
if timer is not None:
timer.deleteLater()
super(MainWindow, self).closeEvent(event)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
from PySide2 import QtCore, QtGui, QtWidgets
import shiboken2
def for_loop_files(paths, interval=100, parent=None, objectName=""):
timer = QtCore.QTimer(parent=parent, singleShot=True, interval=interval)
if objectName:
timer.setObjectName(objectName)
loop = QtCore.QEventLoop(timer)
timer.timeout.connect(loop.quit)
timer.destroyed.connect(loop.quit)
for path in paths:
if shiboken2.isValid(timer):
timer.start()
loop.exec_()
yield path
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.list_widget = QtWidgets.QListWidget()
self.list_widget.setViewMode(QtWidgets.QListView.IconMode)
self.list_widget.setIconSize(QtCore.QSize(128, 128))
self.list_widget.setResizeMode(QtWidgets.QListView.Adjust)
self.list_widget.setFlow(QtWidgets.QListView.TopToBottom)
self.setCentralWidget(self.list_widget)
self.resize(640, 480)
QtCore.QTimer.singleShot(0, self.load_icons)
@QtCore.Slot()
def load_icons(self):
paths = ["icon1.png", "icon2.png", "icon3.png", "icon4.png"]
for path in for_loop_files(paths, parent=self, objectName="icon_timer", interval=30):
it = QtWidgets.QListWidgetItem()
it.setIcon(QtGui.QIcon(path))
self.list_widget.addItem(it)
def closeEvent(self, event):
timer = self.findChild(QtCore.QTimer, "icon_timer")
timer.deleteLater()
super(MainWindow, self).closeEvent(event)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())