Python PyQt5在QThread上为QPushButton加载图像
我有一个UI,它可以加载很多按钮,都带有图像,问题是,它需要很长的时间,所以我尝试将它放入Python PyQt5在QThread上为QPushButton加载图像,python,pyqt5,qthread,qpushbutton,qicon,Python,Pyqt5,Qthread,Qpushbutton,Qicon,我有一个UI,它可以加载很多按钮,都带有图像,问题是,它需要很长的时间,所以我尝试将它放入QThread,我让它工作,但没有速度差异,所以我尝试了不同的解决方案,但现在线程无法启动 代码: 导入系统 导入操作系统 从PyQt5导入* 从PyQt5.QtGui导入* 从PyQt5.QtCore导入* 从PyQt5.QtWidgets导入* 从PyQt5导入QtCore、QtGui、QtPrintSupport、QtWidgets、uic #我已经尝试过使用QThread来实现这一点,但仍然花费了相
QThread
,我让它工作,但没有速度差异,所以我尝试了不同的解决方案,但现在线程无法启动
代码:
导入系统
导入操作系统
从PyQt5导入*
从PyQt5.QtGui导入*
从PyQt5.QtCore导入*
从PyQt5.QtWidgets导入*
从PyQt5导入QtCore、QtGui、QtPrintSupport、QtWidgets、uic
#我已经尝试过使用QThread来实现这一点,但仍然花费了相同的时间。
类LoadImageThumbnailsHead(QThread):
定义初始化(self、列表按钮、列表路径):
QThread.\uuuu init\uuuu(self)
self.listButtons=listButtons
self.listPaths=listPaths
def运行(自):
self.process\u image\u Thread()
def进程图像线程(自):
对于枚举中的i,j(self.listButtons):
j、 setIcon(QIcon(self.listPaths[i]))
j、 setIconSize(QSize(150-6,60-6))
课堂应用程序(QDialog):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.title='PyQt5布局-pythonspot.com'
self.left=10
self.top=10
自宽=320
自身高度=100
self.images_path=[]
self.button_图像=[]
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.left、self.top、self.width、self.height)
self.createGridLayout()
windowLayout=QVBoxLayout()
windowLayout.addWidget(self.horizontalGroupBox)
self.setLayout(windowLayout)
self.show()
def createGridLayout(自身):
self.horizontalGroupBox=QGroupBox(“网格”)
布局=QGridLayout()
布局。setColumnStretch(1,4)
布局。设置柱拉伸(2,4)
对于范围(100)内的i:
self.btnImage=QPushButton()
self.btnImage.setObjectName('btnImage')
self.images\u path.append(os.path.dirname(
abspath(_文件__))+'view.png')
# ! 我也尝试过使用带有可点击标签的像素地图,但没有什么不同。
#pixmap=QPixmap(os.path.dirname(os.path.abspath(_文件__))+image_位置[i])
#pixmap=pixmap.scaled(60300,Qt.KeepAspectRatio,Qt.FastTransformation)
#self.btnImage.setPixmap(pixmap)
# ! 启用此选项将加载图像,但加载速度非常慢
#self.btnImage.setIcon(QIcon(os.path.dirname(os.path.abspath(_文件__))+'/view.png'))
#self.btnImage.setIconSize(QSize(150-6,60-6))
self.button\u images.append(self.btnImage)
layout.addWidget(self.btnImage,i,0)
# ! 这将启动QThread
转换器=LoadImageThumbnailsHead(
self.button\u图像,self.images\u路径)
converter.start()
self.horizontalGroupBox.setLayout(布局)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=QApplication(sys.argv)
ex=App()
sys.exit(app.exec_())
为了解释更多我想要的内容,我想在UI加载后启动一个QThread
,该QThread
将所有图像加载到每个按钮上。问题是:它现在不起作用
我遇到的另一个问题是,当我得到
QThread
时,UI等待它完成,然后突然出现了所有东西。我希望QThread
完全独立,如果愿意的话,可以看到一个接一个地加载所有图像。线程不会加速任何任务但执行不阻止任何线程的任务。鉴于上述情况,如果我有n个“任务”,并且每个任务都在“n”个线程中执行,那么总执行时间将是1个任务,也就是说,没有任务被加速,但任务被重新分配。总之:如果您想加速任务,那么线程不是默认选项,因为它取决于应用程序
另一方面,映像的加载不消耗时间,但有许多任务消耗的时间很少,总的来说相当于消耗大量时间的任务,不幸的是,该任务无法在另一个线程或进程中执行,因为GUI的元素不是线程安全的
一种解决方法是,负载是每T秒由一小群n个元素组成的,因此总任务将被分配,用户将不会观察到任何滞后效应
导入操作系统
导入系统
从PyQt5.QtCore导入QSize、QTimer
从PyQt5.QtGui导入QIcon
从PyQt5.QtWidgets导入(
QApplication,
QDialog,
QGridLayout,
QGroupBox,
QPushButton,
QVBoxLayout,
)
课堂应用程序(QDialog):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.title=“PyQt5布局-pythonspot.com”
self.left=10
self.top=10
自宽=320
自身高度=100
self.images_path=[]
self.button_图像=[]
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.left、self.top、self.width、self.height)
self.createGridLayout()
windowLayout=QVBoxLayout(自)
windowLayout.addWidget(self.horizontalGroupBox)
国际热核聚变实验堆=国际热核聚变实验堆(范围(100))
self.\u timer=QTimer(间隔=10,超时=self.lazy\u加载)
self.\u timer.start()
def createGridLayout(自身):
self.horizontalGroupBox=QGroupBox(“网格”)
self.grid_layout=QGridLayout()
self.grid_layout.setColumnStretch(1,4)
self.grid_layout.setColumnStretch(2,4)
self.horizontalGroupBox.setLayout(self.grid\u布局)
def惰性_加载(自):
尝试:
i=下一个(自身)
除停止迭代外:
self.\u timer.stop()
其他:
btn=QPushButton()
image\u path=os.path.join(os.path.abspath(\uu文件);“view.png”)
btn.设置图标(QIcon(图像路径))