用pyqt5gui线程,处理时显示加载gif

2024-04-26 03:37:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码中有类似的内容,我想在等待完成过程的同时显示加载的gif。我尝试了我发现的这个线程,但是我一直得到这样一个错误:

QObject: Cannot create children for a parent that is in a different thread.

这是我的代码示例

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())

Tags: fromimportselfuiinitdefargsgif