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())
相关推荐
老百姓懂点AI17 小时前
[RAG实战] 向量数据库选型与优化:智能体来了(西南总部)AI agent指挥官的长短期记忆架构设计
python
四维碎片19 小时前
QSettings + INI 笔记
笔记·qt·算法
喵手19 小时前
Python爬虫零基础入门【第九章:实战项目教学·第15节】搜索页采集:关键词队列 + 结果去重 + 反爬友好策略!
爬虫·python·爬虫实战·python爬虫工程化实战·零基础python爬虫教学·搜索页采集·关键词队列
Suchadar19 小时前
if判断语句——Python
开发语言·python
ʚB҉L҉A҉C҉K҉.҉基҉德҉^҉大20 小时前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
喵手20 小时前
Python爬虫零基础入门【第九章:实战项目教学·第14节】表格型页面采集:多列、多行、跨页(通用表格解析)!
爬虫·python·python爬虫实战·python爬虫工程化实战·python爬虫零基础入门·表格型页面采集·通用表格解析
0思必得020 小时前
[Web自动化] 爬虫之API请求
前端·爬虫·python·selenium·自动化
莫问前路漫漫21 小时前
WinMerge v2.16.41 中文绿色版深度解析:文件对比与合并的全能工具
java·开发语言·python·jdk·ai编程
木头左21 小时前
Backtrader框架下的指数期权备兑策略资金管理实现与风险控制
python
玄同76521 小时前
LangChain 核心组件全解析:构建大模型应用的 “乐高积木”
人工智能·python·语言模型·langchain·llm·nlp·知识图谱