PySide6批量创建控件

最近闲的没事写了个漫画爬虫,但在下载的时候出现了问题,有些漫画100多章还好,有的3000章,这就需要连续创建3000个组件,而在创建组件时会直接卡死主界面。

提供两种解决方法。

1. 多线程

将循环放到其他线程,不在同一个时间点创建

python 复制代码
from PySide6.QtWidgets import QScrollArea, QWidget, QGridLayout, QLabel, QApplication

from collections import deque

from PySide6.QtCore import QThread, Signal


class ListLoadThread(QThread):
    signal = Signal(object, object)  # 函数,参数

    def __init__(self, parent=None):
        super().__init__(parent)
        self.queue = deque()

        self.signal.connect(self._handle_callback)

    def _handle_callback(self, func, item):
        if func:
            func(item)

    def run(self):
        while self.queue:
            items, func = self.queue.popleft()
            for item in items:
                self.msleep(30)
                self.signal.emit(func, item)

    def addItem(self, items: list, func: object):
        self.queue.append((items, func))
        if not self.isRunning():
            self.start()


class ScrollArea(QScrollArea):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.scrollWidget = QWidget()
        self.loadThread = ListLoadThread(self)
        self.startBtn = QPushButton("Start", self)
        self.scrollLayout = QGridLayout(self.scrollWidget)

        self.setWidget(self.scrollWidget)
        self.setWidgetResizable(True)
        self.setViewportMargins(10, 30, 10, 10)
        self.scrollLayout.setAlignment(Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignHCenter)

        self.startBtn.clicked.connect(self.start)

    def start(self):
        self.loadThread.addItem([i for i in range(100000)], self.add_item)

    def add_item(self, item):
        label = QLabel(f'Label {item}', self.scrollWidget)
        count = self.scrollLayout.count()
        self.scrollLayout.addWidget(label, count // 6, count % 6)


if __name__ == '__main__':
    app = QApplication([])
    window = ScrollArea()
    window.show()
    app.exec()
2. 异步

试了一下3000个是不卡的,数量再多也是会卡的,超过3000时,还是使用多线程好点

python 复制代码
pip install qasync 
python 复制代码
import asyncio
import sys

from PySide6.QtCore import Qt
from PySide6.QtWidgets import QWidget, QApplication, QPushButton, QLabel, QScrollArea, QGridLayout
from qasync import QEventLoop, asyncSlot


class MainWindow(QScrollArea):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.scrollWidget = QWidget()
        self.startBtn = QPushButton("Start", self)
        self.scrollLayout = QGridLayout(self.scrollWidget)

        self.setWidget(self.scrollWidget)
        self.setWidgetResizable(True)
        self.setViewportMargins(10, 30, 10, 10)
        self.scrollLayout.setAlignment(Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignHCenter)

        self.startBtn.clicked.connect(self.start_scroll)

    async def add_item(self, item):
        label = QLabel(f'Label {item}', self.scrollWidget)
        count = self.scrollLayout.count()
        self.scrollLayout.addWidget(label, count // 6, count % 6)

    @asyncSlot()
    async def start_scroll(self):
        for i in range(1000):
            await self.add_item(i)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    loop = QEventLoop(app)
    asyncio.set_event_loop(loop)

    window = MainWindow()
    window.show()
    sys.exit(loop.run_forever())
相关推荐
落羽凉笙2 小时前
Python学习笔记(3)|数据类型、变量与运算符:夯实基础,从入门到避坑(附图解+代码)
笔记·python·学习
Quintus五等升2 小时前
深度学习①|线性回归的实现
人工智能·python·深度学习·学习·机器学习·回归·线性回归
天远Date Lab2 小时前
Python实战:对接天远数据手机号码归属地API,实现精准用户分群与本地化运营
大数据·开发语言·python
哈里谢顿2 小时前
Python异常链:谁才是罪魁祸首?一探"The above exception"的时间顺序
python
哈里谢顿3 小时前
验证 list() 会调用 `__len__` 方法的深度解析
python·django
vibag3 小时前
构建智能体与工具调用
python·语言模型·大模型·langgraph
小途软件3 小时前
高校宿舍访客预约管理平台开发
java·人工智能·pytorch·python·深度学习·语言模型
-dcr3 小时前
49.python自动化
运维·python·自动化
code bean4 小时前
Flask图片服务在不同网络接口下的路径解析问题及解决方案
后端·python·flask
Chasing Aurora4 小时前
Python后端开发之旅(三)
开发语言·python·langchain·protobuf