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())
相关推荐
c_lb72888 分钟前
最新AI量化练习,小策略更适合练流程感
人工智能·python
hssfscv17 分钟前
QT的学习笔记4——QMainWindow、资源文件以及主要控件的介绍
笔记·qt·学习
电化学仪器白超24 分钟前
低阻域 ADC 与参考源选型理论分析
人工智能·python·单片机·嵌入式硬件·自动化
AI科技星1 小时前
《01无穷全域信息场论:算子G与宇宙本体高维完备公理大典》
人工智能·python·算法·金融·乖乖数学·全域数学
小Q蒙蒙1 小时前
基于AI大模型,将自然语言需求自动转化为结构化测试用例
人工智能·python·ai·测试用例
2601_962341302 小时前
计算机毕业设计之jsp考研在线复习平台
java·大数据·开发语言·hadoop·python·考研·课程设计
luoyayun3612 小时前
Qt + FFmpeg 音频工具:重采样实现
qt·ffmpeg·重采样
云烟成雨TD3 小时前
LangFlow 1.x 系列【7】工作流创建与部署指南
人工智能·python·agent
月疯3 小时前
np.where()[0]的用法
开发语言·python·numpy
KaMeidebaby3 小时前
卡梅德生物技术快报|纳米抗体技术全套实操流程:AFB1 全合成文库淘选 + 分子对接定点突变参数手册
人工智能·python·tcp/ip·算法·机器学习