我有一个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_()
正如上面@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_()