2

画面にグラフィックを表示するための透明なウィンドウを作成する小さなPythonスクリプトがあり、そのグラフィックをアニメーション化したいのですが、どこからどのように開始すればよいかまったくわかりません。これが私が少なくとも持っているものです:

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_()

これは適切な材料を含んでいるように感じますが、ピックスマップは更新されません。

QMovieを試しましたが、透明になっているはずのウィンドウの領域が黒で塗りつぶされています。

4

3 に答える 3

0

まず、アニメーションGIFが実際に適切な透明な背景を持っていることを確認してください。次のコードは、この火の画像をソースとして使用して、私のために機能します:

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()

これにより、完全に透明でフレームのないウィンドウが作成され、アニメーションGIFがQMovieで再生されます。画像の後ろに黒が描かれていません。それは、下にあるものを完全に見通す必要があります。

元のコードからそれほど遠くはありません。マスクを設定したり、ペイントイベントを実行したりする必要はありません。

于 2012-12-09T00:21:47.637 に答える
0

www.daniweb.comからこのコードをチェックして、必要に応じて変更できるかどうかを確認してください。

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_())
于 2012-12-09T00:22:12.443 に答える
0

これは結局、見落としの単純な修正でした。

imgnumberdefの外にある必要があり、変更されるたびself.imgnumberに名前を付ける必要がありました。self.imgnumber

于 2012-12-09T16:16:32.720 に答える