Animate using a pixmap or image sequence in Python with QT4

时间秒杀一切 提交于 2019-12-12 18:32:59

问题


I have a small Python script that makes a transparent window for displaying a graphic on screen and I'd like to animate that graphic, but am entirely unsure how or where to even start. Here's what I do have at least:

import sys
from PyQt4 import QtGui, Qt, QtCore

class Transparent(QtGui.QWidget):

    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setAttribute(Qt.Qt.WA_NoSystemBackground)
        self.setAutoFillBackground(True)

        pixmap = QtGui.QPixmap("test1.gif")
                pixmap2 = QtGui.QPixmap("test2.gif")
        width = pixmap.width()
        height = pixmap.height()

        self.setWindowTitle("Status")
            self.resize(width, height)

            self.label = QtGui.QLabel(self)


        def animateEvent():
                    imgnumber = 0
                    try:
                        if imgnumber == 1:
                            self.label.setPixmap(QtGui.QPixmap("test1.gif"))
                            self.setMask(pixmap.mask())
                            imgnumber = 0
                        else:
                            self.label.setPixmap(QtGui.QPixmap("test2.gif"))
                            self.setMask(pixmap2.mask())
                            imgnumber = 1
                    finally:
                        QtCore.QTimer.singleShot(1000, animateEvent)

                animateEvent()


        def paintEvent(self,event):
        self.setAttribute(Qt.Qt.WA_NoSystemBackground)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    x = Transparent()
    x.show()
    app.exec_()

This feels like it has the right ingredients, but the pixmap doesn't update.

I tried QMovie, but then the area of the window that is supposed to be transparent is filled with black instead.


回答1:


First, just make sure your animated gif really does have a proper transparent background. The following code works for me, using this fire image as a source:

class Transparent(QtGui.QWidget):

    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setAttribute(QtCore.Qt.WA_NoSystemBackground)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)

        filename = "test.gif"

        size = QtGui.QImage(filename).size()

        self.setWindowTitle("Status")

        layout = QtGui.QVBoxLayout(self)
        layout.setMargin(0)

        self.movie = QtGui.QMovie(filename)
        self.label = QtGui.QLabel(self)
        self.label.setMovie(self.movie)

        layout.addWidget(self.label)
        self.resize(size)

        self.movie.start()

This will create a completely transparent and frameless window, with the animated gif playing in a QMovie. There is no black being drawn behind the image. It should fully see through to what ever is underneath.

It is not so far off from your original code. You shouldn't need to set the mask, or do a paint event.




回答2:


check out this code from www.daniweb.com and see if you can modify it to your needs:

import sys 
from PyQt4.QtCore import *
from PyQt4.QtGui import * 

class MoviePlayer(QWidget): 
    def __init__(self, gif, parent=None): 
        super(MoviePlayer, self).__init__(parent)

        self.setGeometry(200, 200, 400, 400)
        self.setWindowTitle("QMovie to show animated gif")

        self.movie_screen = QLabel()
        self.movie_screen.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)        
        self.movie_screen.setAlignment(Qt.AlignCenter) 

        btn_start = QPushButton("Start Animation")
        btn_start.clicked.connect(self.start) 

        btn_stop = QPushButton("Stop Animation")
        btn_stop.clicked.connect(self.stop) 

        main_layout = QVBoxLayout() 
        main_layout.addWidget(self.movie_screen)
        main_layout.addWidget(btn_start) 
        main_layout.addWidget(btn_stop)
        self.setLayout(main_layout) 

        self.movie = QMovie(gif, QByteArray(), self) 
        self.movie.setCacheMode(QMovie.CacheAll) 
        self.movie.setSpeed(100) 
        self.movie_screen.setMovie(self.movie) 


    def start(self):
        """
        Start animation
        """
        self.movie.start()

    def stop(self):
        """
        Stop the animation
        """
        self.movie.stop()


app = QApplication(sys.argv) 
player = MoviePlayer("/path/to/image.gif") 
player.show() 
sys.exit(app.exec_())



回答3:


This ended up being a simple correction of an oversight in the end.

imgnumber needed to be outside of the def as self.imgnumber and needed to be named self.imgnumber each time it was changed.



来源:https://stackoverflow.com/questions/13783107/animate-using-a-pixmap-or-image-sequence-in-python-with-qt4

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!