2016-01-05 137 views
0

我想在函數完成之前顯示加載gif。當函數執行時QtGui.QMovie gif停止

我的代碼是

self.LoadingGif = QtGui.QLabel(MainWindow) 
movie = QtGui.QMovie("hashUpdate.gif") 
self.LoadingGif.setMovie(movie) 
self.LoadingGif.setAlignment(QtCore.Qt.AlignCenter) 
self.gridLayout_2.addWidget(self.LoadingGif, 4, 1, 1, 1) 
movie.start() 
self.MYFUNCTION() 

的問題是,GIF節目,但它是不是在玩。它只在功能完成時開始播放。
如何在函數執行過程中使GIF播放?

回答

5

GIF停止播放,因爲您的功能self.MYFUNCTION阻止了Qt事件循環。 Event循環是Qt的一部分,它處理鼠標/鍵盤事件,處理小部件的重繪(當你將鼠標懸停在它們上面或點擊它們時,就像按鈕一樣),並更新播放動畫時顯示的當前幀。

所以Qt事件循環負責執行你的代碼以響應你的程序中發生的各種事情,但是當它執行你的代碼時,它不能做任何事情。

所以你需要改變你的代碼。有幾種解決方案,以這樣的:在輔助線程

  • 運行MYFUNCTION所以它不會阻止Qt的事件循環。但是,如果您的函數以任何方式與Qt GUI進行交互,則這是而不是選項。如果您在MYFUNCTION(如更新標籤或其他)中調用任何Qt GUI方法,則絕不能從輔助線程完成(如果您嘗試,程序將隨機崩潰)。建議使用帶有Qt的QThread而不是Python線程,但如果您不需要從函數返回主線程,則Python線程將正常工作。

  • 如果MYFUNCTION運行很長一段時間,因爲你有一個for/while循環,你可以考慮使用一個QTimer定期調用循環中的代碼。在執行QTimer之後,控制權會返回到Qt事件循環,因此它可以在循環迭代之間處理其他事情(如更新動畫)。

  • 在您的功能期間定期撥打QApplication.instance().processEvents()。這也會將控制權返回給Qt事件循環,但如果您的函數也在使用Qt進行操作,您可能會收到意外的行爲。

1

您需要將self.your_function移動到另一個thread,讓Qt更新GUI和您的GIF!