Python QWidget在还调用QRunnable时不加载子元素

Python QWidget在还调用QRunnable时不加载子元素,python,python-3.x,pyside2,Python,Python 3.x,Pyside2,我正在使用Python3.7和PySide2的数据处理桌面应用程序中工作,该应用程序要求我将多个大型(约25万行)excel文件中的数据加载到程序的处理库中。为此,我在我的应用程序中设置了一个简单的弹出窗口(称为LoadingPopup),其中包括一个旋转的gif和一个简单的标题,以及一些使用pandas将数据从excel文件加载到全局对象的代码。这两种功能在单独运行时都能正常工作,但如果我碰巧在代码库的同一范围内创建了一个加载对话框和一个不可命名的worker,加载小部件中包含的小部件(gif

我正在使用Python3.7和PySide2的数据处理桌面应用程序中工作,该应用程序要求我将多个大型(约25万行)excel文件中的数据加载到程序的处理库中。为此,我在我的应用程序中设置了一个简单的弹出窗口(称为LoadingPopup),其中包括一个旋转的gif和一个简单的标题,以及一些使用pandas将数据从excel文件加载到全局对象的代码。这两种功能在单独运行时都能正常工作,但如果我碰巧在代码库的同一范围内创建了一个加载对话框和一个不可命名的worker,加载小部件中包含的小部件(gif和简单标题)将不会显示

我已经尝试将小部件的父类型从QDialog更改为QWidget,或者在小部件内外初始化弹出窗口(start()函数)。我对Qt5不是很有经验,所以我不知道还能做什么


导入系统、时间、回溯
从PySide2.QtWidgets导入*
从PySide2.QtCore导入*
从PySide2.QtGui导入*
从TsrUtils导入PathUtils
类工作信号(QObject):
完成=信号()
错误=信号(元组)
结果=信号(对象)
TsrWorker类(QRunnable):
定义初始值(self,fn,*args,**kwargs):
超级(TsrWorker,self)。\uuuu init\uuuuuu()
self.fn=fn
self.args=args
self.kwargs=kwargs
self.signals=WorkerSignals()
@槽()
def运行(自):
尝试:
结果=self.fn(*self.args,**self.kwargs)
除:
traceback.print_exc()
exctype,value=sys.exc_info()[:2]
self.signals.error.emit((exctype,value,traceback.format_exc())
其他:
self.signals.result.emit(结果)
最后:
self.signals.finished.emit()
类加载弹出窗口(QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.message=“Cargando”
自设置最小尺寸(350300)
self.setWindowIcon(\
QIcon(PathUtils.ruta_absoluta('resources/icons/tsr.png'))
self.setWindowTitle(self.message)
self.layout=QVBoxLayout(self)
self.setLayout(self.layout)
self.movie=QMovie(self)
self.movie.setFileName(“./resources/img/spinner.gif”)
self.movie.setCacheMode(QMovie.CacheAll)
self.movie.start()
self.load=QLabel(self)
self.loading.setMovie(self.movie)
self.load.setAlignment(Qt.AlignCenter)
self.layout.addWidget(self.loading)
self.lbl=QLabel(self.message,self)
self.lbl.setAlignment(Qt.AlignCenter)
self.lbl.setStyleSheet(“字体:15pt”)
self.layout.addWidget(self.lbl)
MyMainApp类(QApplication):
定义初始化(self,args):
super()。\uuuu init\uuuuu()
self.l=LoadingPopup()
self.l.show()
w=TsrWorker(时间。睡眠,5)
w、 signals.finished.connect(self.terminado)
w、 运行()
def terminado(self):
打印('计时器已完成')
self.l.hide()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=MyMainApp(sys.argv)
sys.exit(app.exec_())

我使用time.sleep函数更改了示例中应用程序的实际数据加载部分。我的预期结果是,我应该能够让LoadingPopup显示为gif移动,然后它应该在QRunnable完成后关闭。

您不应该直接调用run方法,因为您将在GUI线程上运行繁重的任务。您必须使用QThreadPool启动它:

class MyMainApp(QApplication):
定义初始化(self,args):
super()。\uuuu init\uuuuu()
self.l=LoadingPopup()
self.l.show()
w=TsrWorker(时间。睡眠,5)
w、 signals.finished.connect(self.terminado)
#w.运行()

QThreadPool.globalInstance().start(w)#这对我很有效,谢谢你的快速修复。智利萨卢多斯酒店。