我想在启动一些操作时给我的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!")
因为这是我第一次使用线程,所以我找不到哪里出了问题。。在
这并没有给出任何结果,尽管我认为我离正确的代码并不太远。在
我已经设法使悸动者出现,但不是在正确的时刻(当时线程不工作)。在
我没有使用
QThread
,而是使用了subprocess
,效果很好。 但我不知道两者之间的区别,比如一个比另一个“更好”,或者他们有微小的差异等等,但这确实起作用了!在您的代码有一个问题,在主线程中执行对
os.system()
的调用(这可能是长时间运行的,因此需要一个throbber)。这会阻塞GUI(和Qt事件循环)。QMovie
需要一个正常工作的事件循环才能正确设置动画。因此,对于您当前的代码,您无法做任何事情来使throubber显示为动画,因为这需要一个响应的GUI(或者更准确地说是响应事件循环)。在另外,也不允许从线程直接调用GUI方法。只能从辅助线程向主线程发出事件(正如您当前所做的那样)。这意味着您无法将
QMovie
卸载到线程。在因此,您需要将对
os.system()
的调用卸载到线程中,并在完成后发出一个信号。这个信号可以被连接到一个能阻止震动器的插槽上。在启动线程之前,直接调用现有的startThrobber()
方法来开始throubber。在当你的动画(包括动画)正在运行的时候,包括你的动画在内的所有东西都会被正确的显示出来。在
相关问题 更多 >
编程相关推荐