为什么在创建大量 QPushButtons 时使用 PyQt5 获取 Python 很慢?
Why get's Python with PyQt5 slow when creating a large amount of QPushButtons?
我正在用 PyQt5 构建一个更大的程序。我想在 ScrollArea 中创建大量可点击的 QPushButton。
据我所知,该程序目前运行正常,但当按钮数量变多时(大约 10,000 到 20,000 个字符),它变得非常慢。
如何确保此程序构建这些按钮具有响应性?我需要加载由字符分隔的文本文件作为 QPushButtons,它们通常大约 15-20 kb(有时高达 50 kb)。我相信,这不应该是一个大小限制。
import sys
from PyQt5.QtWidgets import QApplication, QGridLayout, QScrollArea, QPushButton, QVBoxLayout, QWidget
class Widget(QWidget):
def __init__(self, parent= None):
super(Widget, self).__init__()
self.setFixedHeight(200)
self.setFixedWidth(1000)
self.setGeometry(50, 100, 600, 500)
widget = QWidget()
layout = QVBoxLayout(self)
grid = QGridLayout()
gridpos = [0, 0]
number = 15000
for i in range(number):
btn = QPushButton('x')
btn.setCheckable(True)
grid.addWidget(btn, *gridpos)
gridpos[1] += 1
if gridpos[1] == 10:
gridpos[0] += 1
gridpos[1] = 0
layout.addLayout(grid)
widget.setLayout(layout)
scroll = QScrollArea()
scroll.setWidgetResizable(False)
scroll.setWidget(widget)
vLayout = QVBoxLayout(self)
vLayout.addWidget(scroll)
self.setLayout(vLayout)
if __name__ == '__main__':
app = QApplication(sys.argv)
dialog = Widget()
dialog.show()
app.exec_()
显然,大量的 qpushbuttons "expensive" 会减慢程序速度。因此,似乎没有办法立即生成 10,000 到 20,000 个 qpushbuttons。
然而,有效的是仅显示可见按钮并在它们在 window 中可见时生成新按钮。
我正在用 PyQt5 构建一个更大的程序。我想在 ScrollArea 中创建大量可点击的 QPushButton。
据我所知,该程序目前运行正常,但当按钮数量变多时(大约 10,000 到 20,000 个字符),它变得非常慢。
如何确保此程序构建这些按钮具有响应性?我需要加载由字符分隔的文本文件作为 QPushButtons,它们通常大约 15-20 kb(有时高达 50 kb)。我相信,这不应该是一个大小限制。
import sys
from PyQt5.QtWidgets import QApplication, QGridLayout, QScrollArea, QPushButton, QVBoxLayout, QWidget
class Widget(QWidget):
def __init__(self, parent= None):
super(Widget, self).__init__()
self.setFixedHeight(200)
self.setFixedWidth(1000)
self.setGeometry(50, 100, 600, 500)
widget = QWidget()
layout = QVBoxLayout(self)
grid = QGridLayout()
gridpos = [0, 0]
number = 15000
for i in range(number):
btn = QPushButton('x')
btn.setCheckable(True)
grid.addWidget(btn, *gridpos)
gridpos[1] += 1
if gridpos[1] == 10:
gridpos[0] += 1
gridpos[1] = 0
layout.addLayout(grid)
widget.setLayout(layout)
scroll = QScrollArea()
scroll.setWidgetResizable(False)
scroll.setWidget(widget)
vLayout = QVBoxLayout(self)
vLayout.addWidget(scroll)
self.setLayout(vLayout)
if __name__ == '__main__':
app = QApplication(sys.argv)
dialog = Widget()
dialog.show()
app.exec_()
显然,大量的 qpushbuttons "expensive" 会减慢程序速度。因此,似乎没有办法立即生成 10,000 到 20,000 个 qpushbuttons。
然而,有效的是仅显示可见按钮并在它们在 window 中可见时生成新按钮。