对throb使用QThread

2024-10-03 00:23:12 发布

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

我想在启动一些操作时给我的GUI添加一个throubber。在

这是我的剧本:

class StartTask(QtCore.QThread):
    taskStarted = pyqtSignal()
    def run(self):
        self.taskStarted.emit()

class StopTask(QtCore.QThread):
    taskStopped = pyqtSignal()
    def run(self):
        self.taskStopped.emit()

class Projet(object):

    def __init__(self):
        self.movie = '' # throbber
        self.startTask = StartTask()
        self.startTask.taskStarted.connect(self.startThrobber)
        self.stopTask = StopTask()
        self.stopTask.taskStopped.connect(self.stopThrobber)

    def startThrobber(self):
        # set up the movie screen on a label
        self.movie_screen = QLabel()
        # expand and center the label
        main_layout = QVBoxLayout()
        main_layout.addWidget(self.movie_screen)
        ui.throbberTab2.setLayout(main_layout)
        # use an animated gif file you have in the working folder
        byteF = QByteArray()
        movie = QMovie("D:\Various\Images\loader.gif", byteF)
        movie.setCacheMode(QMovie.CacheAll)
        movie.setSpeed(100)
        self.movie_screen.setMovie(movie)
        movie.start()

        return movie

    def stopThrobber(self):
        movie1 = self.startThrobber()
        movie1.stop()

    def goAction(self):
        if ui.chkbox.isChecked():
            self.startTask.taskStarted.connect(self.startThrobber)
            os.system(r'..........') # script launched
            self.stopTask.taskStopped.connect(self.stopThrobber)
            QMessageBox.information(self.popup(), "Information", "It works!")

因为这是我第一次使用线程,所以我找不到哪里出了问题。。在

这并没有给出任何结果,尽管我认为我离正确的代码并不太远。在

我已经设法使悸动者出现,但不是在正确的时刻(当时线程不工作)。在


Tags: theselfmaindefconnectmoviescreenclass
2条回答

我没有使用QThread,而是使用了subprocess,效果很好。 但我不知道两者之间的区别,比如一个比另一个“更好”,或者他们有微小的差异等等,但这确实起作用了!在

您的代码有一个问题,在主线程中执行对os.system()的调用(这可能是长时间运行的,因此需要一个throbber)。这会阻塞GUI(和Qt事件循环)。QMovie需要一个正常工作的事件循环才能正确设置动画。因此,对于您当前的代码,您无法做任何事情来使throubber显示为动画,因为这需要一个响应的GUI(或者更准确地说是响应事件循环)。在

另外,也不允许从线程直接调用GUI方法。只能从辅助线程向主线程发出事件(正如您当前所做的那样)。这意味着您无法将QMovie卸载到线程。在

因此,您需要将对os.system()的调用卸载到线程中,并在完成后发出一个信号。这个信号可以被连接到一个能阻止震动器的插槽上。在启动线程之前,直接调用现有的startThrobber()方法来开始throubber。在

当你的动画(包括动画)正在运行的时候,包括你的动画在内的所有东西都会被正确的显示出来。在

相关问题 更多 >