我有一个加载小部件由两个标签组成,一个是状态标签,另一个是显示动画gif的标签。如果我调用show()
方法处理大量内容之前,加载小部件中的gif根本不会自行更新。 gif btw没有错(循环问题等)。主代码(主叫)看起来是这样的:标签内显示的Gif不会自定义更新Pyqt5
self.loadingwidget = LoadingWidgetForm()
self.setCentralWidget(self.loadingwidget)
self.loadingwidget.show()
...
...
heavy stuff
...
...
self.loadingwidget.hide()
Widget类:
class LoadingWidgetForm(QWidget, LoadingWidget):
def __init__(self, parent=None):
super().__init__(parent=parent)
self.setupUi(self)
self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground)
pince_directory = SysUtils.get_current_script_directory() # returns current working directory
self.movie = QMovie(pince_directory + "/media/loading_widget_gondola.gif", QByteArray())
self.label_Animated.setMovie(self.movie)
self.movie.setScaledSize(QSize(50, 50))
self.movie.setCacheMode(QMovie.CacheAll)
self.movie.setSpeed(100)
self.movie.start()
self.not_finished=True
self.update_thread = Thread(target=self.update_widget)
self.update_thread.daemon = True
def showEvent(self, QShowEvent):
QApplication.processEvents()
self.update_thread.start()
def hideEvent(self, QHideEvent):
self.not_finished = False
def update_widget(self):
while self.not_finished:
QApplication.processEvents()
正如你看到我试图创建一个单独的线程,以避免工作量,但它并没有任何区别。然后,我通过重写run()
方法来尝试QThread类的运气,但它也没有奏效。但是执行QApplication.processEvents()
的方法很重要。我也认为我不应该使用单独的线程,我觉得应该有一个更优雅的方式来做到这一点。窗口小部件看起来像这样BTW:
提前感谢!祝你有美好的一天。
编辑:由于存在缺陷,我无法将沉重的东西移动到不同的线程。 Pexpect的spawn()方法需要派生对象以及与生成对象相关的任何操作都在同一个线程中。我不想改变整个程序的工作流程
感谢您花时间回答我的问题并给予深入解答。但据我所知,你正在创建一个与主线程分离的线程。我已经说过,由于缺陷(我的帖子结尾),我无法将繁重的工作转移到另一个线程中, – Desertricker