Ich habe ein Laden Widget, das aus zwei Etiketten besteht, eines ist die Statusbezeichnung und das andere ist die Bezeichnung, die das animierte GIF angezeigt wird. Wenn ich Call show()
Methode, bevor schwere Sachen verarbeitet wird, aktualisiert sich das gif am Lade-Widget überhaupt nicht. Es ist nichts falsch mit dem gif btw (Looping Probleme etc.). Der Hauptcode (Anrufer) sieht wie folgt aus:Gifs innerhalb eines Etiketts angezeigt aktualisiert sich nicht regelmäßig in Pyqt5
self.loadingwidget = LoadingWidgetForm()
self.setCentralWidget(self.loadingwidget)
self.loadingwidget.show()
...
...
heavy stuff
...
...
self.loadingwidget.hide()
Das Widget-Klasse:
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()
Wie Sie sehen, ich versucht, einen separaten Thread zu erstellen Arbeitsbelastung zu vermeiden, aber es machte keinen Unterschied machen. Dann versuchte ich mein Glück mit der QThread-Klasse, indem ich die run()
-Methode außer Kraft setzte, aber es hat auch nicht funktioniert. Aber Ausführung QApplication.processEvents()
Methode innerhalb der schweren Sachen funktioniert gut. Ich denke auch, dass ich keine separaten Threads verwenden sollte. Ich denke, es sollte einen eleganteren Weg geben, dies zu tun. Das Widget sieht wie folgt aus btw:
Processing ...
Vollversion der gif:
Vielen Dank im Voraus! Haben Sie einen guten Tag.
Edit: Ich kann die schweren Sachen nicht auf einen anderen Thread aufgrund von Bugs in Pexpect verschieben. Die spawn() - Methode von Pexpect erfordert, dass das erzeugte Objekt und alle mit dem erzeugten Objekt verbundenen Operationen im selben Thread sind. Ich möchte den Arbeitsablauf des gesamten Programms nicht ändern
Vielen Dank, dass Sie sich die Zeit genommen haben und mir eine gründliche Antwort gegeben haben. Aber wie ich verstanden habe, erstellen Sie einen Thread, der vom Hauptthread getrennt ist. Ich habe bereits gesagt, dass ich die schwere Arbeit wegen Bugs in pexpect (am Ende meines Posts) nicht in einen anderen Thread verschieben kann. – Desertricker