QThread не запускает GIF, пока выполняется некоторая функция загрузки. Это заблокировано. И перезапускается только после окончания загрузки - PullRequest
0 голосов
/ 29 марта 2020

У меня есть GIF, который должен запускаться в отдельном потоке, как только будет выполнена функция загрузки после нажатия кнопки «Да» в окне сообщения. Сначала он запускается до нажатия кнопки «да», после нажатия кнопки «да» он блокируется и не попадает в отдельный поток. Я думаю, что он не перемещается в новый поток, а выполняется в том же потоке. Я хочу, чтобы он перешел в новую ветку. Мой код выглядит следующим образом.

from PyQt5.QtCore import QObject, QThread, Qt, QObject
from PyQt5.QtWidgets import QMainWindow, QDialog, QVBoxLayout, QApplication, QMessageBox, QLabel
from PyQt5.QtGui import QMovie


class LOADINGSCREEN(QThread, QObject):

    def __init__(self):

        super().__init__()

        self.LOADIGWINDOW = QDialog()
        self.LOADIGWINDOW.setWindowFlags(Qt.SplashScreen)
        self.LOADIGWINDOW.setAttribute(Qt.WA_DeleteOnClose)

        self.MOVIE = QMovie("C:/Users/Siva/Desktop/test.gif", cacheMode=QMovie.CacheAll)

        self.LOADINGLABEL = QLabel(alignment=Qt.AlignCenter)
        self.LOADINGLABEL.setMovie(self.MOVIE)

        self.LOADINGVBOX = QVBoxLayout(self.LOADIGWINDOW)
        self.LOADINGVBOX.addWidget(self.LOADINGLABEL)

        self.LOADIGWINDOW.show()
        self.MOVIE.start()

        print("THE LOADING SCREEN HAS BEEN STARTED")

########################################################################################

class GUI(QMainWindow):

    def __init__(self):

        super().__init__()

        self.LOADINGSCREEN = LOADINGSCREEN()
        self.PROMPT = QMessageBox()
        RESPONSE = self.PROMPT.question(self,'', "DO YOU WANT TO DOWNLOAD DATA ?", self.PROMPT.Yes | self.PROMPT.No)

        if RESPONSE == self.PROMPT.Yes:
            self.THREAD = QThread()
            self.THREAD.start()
            self.LOADINGSCREEN.moveToThread(self.THREAD)

            self.downloaddata()
        else:
            pass

        print("GOING TO GUI CREATION")

    def downloaddata(self):

        for i in range(5):
            QThread.msleep(1000)
            print(i)

##        self.LOADINGSCREEN.MOVIE.stop()

########################################################################################

if __name__ == "__main__":

    APP = QApplication([])
    GUI = GUI()
    GUI.show()
    APP.exec_()

1 Ответ

0 голосов
/ 29 марта 2020

Как предложено выше @musicmante, я поместил функцию загрузки в отдельный поток и убедился, что все элементы GUI работают только в основном потоке.

from PyQt5.QtCore import QObject, QThread, Qt, QObject, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QMainWindow, QDialog, QVBoxLayout, QApplication, QMessageBox, QLabel, QPushButton
from PyQt5.QtGui import QMovie
##import win32com.client


class DOWNLOADDATA(QObject):

    started  = pyqtSignal()
    finished = pyqtSignal()

    @pyqtSlot()
    def downloaddata(self):

        print("STARTED DOWNLOADING DATA")
        self.started.emit()
        for i in range(5):
            QThread.msleep(1000)
            print(i)
        self.finished.emit()

########################################################################################

class GUI(QMainWindow):

    def __init__(self):

        super().__init__()

        self.THREAD = QThread(self)
        self.THREAD.start()

        self.DOWNLOADDATA = DOWNLOADDATA()
        self.DOWNLOADDATA.moveToThread(self.THREAD)
        self.DOWNLOADDATA.started.connect(self.runloadingscreen)

        self.PROMPT = QMessageBox()
        RESPONSE = self.PROMPT.question(self,'', "DO YOU WANT TO DOWNLOAD DATA ?", self.PROMPT.Yes | self.PROMPT.No)

        INVISIBLEBUTTON = QPushButton("Open window")
        INVISIBLEBUTTON.clicked.connect(self.DOWNLOADDATA.downloaddata)

        if RESPONSE == self.PROMPT.Yes:
            INVISIBLEBUTTON.click()
        else:
            self.CONTINUEINIT()

    @pyqtSlot()
    def runloadingscreen(self):

        print("THE LOADING SCREEN HAS BEEN STARTED")

        self.LOADIGWINDOW = QDialog()
        self.LOADIGWINDOW.setWindowFlags(Qt.SplashScreen)
        self.LOADIGWINDOW.setAttribute(Qt.WA_DeleteOnClose)
        self.DOWNLOADDATA.finished.connect(self.LOADIGWINDOW.close)
        self.DOWNLOADDATA.finished.connect(self.CONTINUEINIT)

        self.MOVIE = QMovie("C:/Users/Siva/Desktop/test.gif", cacheMode=QMovie.CacheAll)

        self.LOADINGLABEL = QLabel(alignment=Qt.AlignCenter)
        self.LOADINGLABEL.setMovie(self.MOVIE)

        self.LOADINGVBOX = QVBoxLayout(self.LOADIGWINDOW)
        self.LOADINGVBOX.addWidget(self.LOADINGLABEL)

        self.LOADIGWINDOW.show()
        self.MOVIE.start()

    def CONTINUEINIT(self):
        self.LABEL = QLabel("EVERYTHING IS FINE NOW")
        self.setCentralWidget(self.LABEL)
        self.show()

########################################################################################

if __name__ == "__main__":

    APP = QApplication([])
    GUI = GUI()
    GUI.show()
    APP.exec_()
...