QThread在执行某些下载功能时未运行GIF。它被阻止。并且仅在下载功能结束后才重新启动

问题描述 投票:-1回答:1

我有一个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_()
python-3.x pyqt5 python-multithreading
1个回答
0
投票

正如上面@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_()
© www.soinside.com 2019 - 2024. All rights reserved.