使用pyqt5 gui进行线程处理,在处理过程中显示加载的gif文件

时间:2019-10-08 13:06:57

标签: python multithreading pyqt5

我的代码中有类似的内容,我想在等待完成过程时显示加载的gif。我尝试了发现的该线程,但是不断收到此错误消息:

  

QObject:无法为处于不同线程中的父级创建子级。

这是我的代码示例

from PyQt5 import QtWidgets, uic
from PyQt5.Qt import Qt
from PyQt5.QtCore import QByteArray, QSize, QRunnable, 
QThreadPool, pyqtSlot
from PyQt5.QtGui import QMovie
from PyQt5.QtWidgets import QPushButton
import main2 as main_framework

class Worker(QRunnable):
   def __init__(self, fn, *args, **kwargs):
       super(Worker, self).__init__()
       self.fn = fn
       self.args = args
       self.kwargs = kwargs

   @pyqtSlot()
   def run(self):
       self.fn(*self.args, **self.kwargs)

class Ui_Login(QtWidgets.QDialog, QPushButton):
   def __init__(self):
       super(Ui_Login, self).__init__()
       uic.loadUi("gui/loginpage.ui", self)
       self.frame_loadinggif.setVisible(False)
       self.btn_signin.clicked.connect(self.signin)
       self.btn_close.clicked.connect(self.signout)
       self.threadpool = QThreadPool()

   def task(self):
       print("in")
       form = main_framework.Ui_MainWindow()
       form.show()
       self.btn_signin.setEnabled(True)
       self.hide()

   def loadinggif(self):
       self.frame_loadinggif.setVisible(True)
       self.gif = QMovie("images/ajax-loader.gif", QByteArray(), self)
       self.lbl_loading_gif.setMovie(self.gif)
       self.gif.setScaledSize(QSize().scaled(25, 25, Qt.KeepAspectRatio))
       self.gif.start()

   def signin(self):
       print("processing")
       self.loadinggif()
       worker = Worker(self.task)
       self.threadpool.start(worker)
       self.btn_signin.setEnabled(False)

   def signout(self):
       print("out")
       sys.exit()

if __name__ == "__main__":
   import sys
   app = QtWidgets.QApplication(sys.argv)
   ui = Ui_Login()
   ui.show()
   sys.exit(app.exec())

0 个答案:

没有答案