I would like to show a .gif animation in a QLabel
widget, alongside text.
The following code won't work:
self.status_txt = QtGui.QLabel('Loading... <img src="etc/loading.gif">')
as the image won't animate.
I tried achiving it by using a QMovie
object:
self.status_txt = QtGui.QLabel("Loading...")
movie = QtGui.QMovie("etc/loading.gif")
self.status_txt.setMovie(movie)
movie.start()
But then I can't put the animation and the text together. Is there a different solution besides using two different labels?
you can add a Layout to the label, and then add another Label with the text to that...
self.status_txt = QtGui.QLabel()
movie = QtGui.QMovie("etc/loading.gif")
self.status_txt.setMovie(movie)
movie.start()
self.status_txt.setLayout(QtGui.QHBoxLayout())
self.status_txt.layout().addWidget(QLabel('Loading...'))
edit:
it's possible if you use your own version of a QLabel and a QPainter to paint the text yourself:
from PyQt4.QtCore import QSize
from PyQt4.QtGui import QApplication, QLabel, QMovie, QPainter, QFontMetrics
class QTextMovieLabel(QLabel):
def __init__(self, text, fileName):
QLabel.__init__(self)
self._text = text
m = QMovie(fileName)
m.start()
self.setMovie(m)
def setMovie(self, movie):
QLabel.setMovie(self, movie)
s=movie.currentImage().size()
self._movieWidth = s.width()
self._movieHeight = s.height()
def paintEvent(self, evt):
QLabel.paintEvent(self, evt)
p = QPainter(self)
p.setFont(self.font())
x = self._movieWidth + 6
y = (self.height() + p.fontMetrics().xHeight()) / 2
p.drawText(x, y, self._text)
p.end()
def sizeHint(self):
fm = QFontMetrics(self.font())
return QSize(self._movieWidth + 6 + fm.width(self._text),
self._movieHeight)
def setText(self, text):
self._text = text
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
l = QTextMovieLabel('Loading...', 'loading.gif')
l.show()
app.exec_()
Short, to the point answer:
movie = QtGui.QMovie('file.gif')
my_label.setMovie(movie)
movie.start()
Note that the import statement in this case is from PyQt5 import QtCore, QtGui, QtWidgets
which is the default generated by Qt Designer.
I have found that there is not possible way to use the same widget for this job. Two different QLabels must be used.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With