PyQt5:在 Qmovie 中重新加载 gif

Posted

技术标签:

【中文标题】PyQt5:在 Qmovie 中重新加载 gif【英文标题】:PyQt5: Reloading gif in Qmovie 【发布时间】:2018-06-01 22:27:58 【问题描述】:

我将如何在 PyQt5 中重新加载新的动画 gif 文件?

我想做什么:

    加载 test.gif 播放 test.gif 用另一个任意动画 gif 覆盖原始 test.gif 文件 点击按钮时让 Qmovie 重新加载 gif 显示新的 gif

这是我设置的基本代码来尝试这样做,但是单击按钮刷新不起作用:

import sys
from PyQt5.QtCore import Qt, QByteArray, QSettings, QTimer, pyqtSlot
from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QSizePolicy, QVBoxLayout, QAction, QPushButton
from PyQt5.QtGui import QMovie

class GifPlayer(QWidget):
    def __init__(self, title, parent=None):
        QWidget.__init__(self, parent)

        self.movie = QMovie("test.gif", QByteArray(), self)
        size = self.movie.scaledSize()
        self.setGeometry(200, 200, size.width(), size.height())
        self.setWindowTitle(title)
        self.movie_screen = QLabel()
        self.movie_screen.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.movie_screen.setAlignment(Qt.AlignCenter)        
        main_layout = QVBoxLayout()
        main_layout.addWidget(self.movie_screen)
        self.setLayout(main_layout)
        self.movie.setCacheMode(QMovie.CacheAll)
        self.movie_screen.setMovie(self.movie)
        self.movie.start()
        self.movie.loopCount()

        button = QPushButton('refresh gif', self)
        button.setToolTip('This is an example button')
        button.move(10,10)
        button.clicked.connect(self.on_click)

    @pyqtSlot()
    def on_click(self):
        self.movie_screen.setMovie(self.movie)
        print("done")     

if __name__ == "__main__":  
    app = QApplication(sys.argv)
    player = GifPlayer("update this gif")
    player.show()
    sys.exit(app.exec_())

【问题讨论】:

你必须创建另一个电影,然后调用 start() 我将每 5 分钟更新一次,我是否必须每 5 分钟再制作一部电影? 是的,你为什么要另辟蹊径? 【参考方案1】:

事实证明,这是一个从根本上简单的解决方法。该错误试图仅刷新 movie_screen 而不是电影本身。只需再次设置 QMovie 文件,让 movie_screen 重新显示它,然后开始播放电影。这是更正后的代码:

gifFile = "test.gif"
class GifPlayer(QWidget):
    def __init__(self, title, gifFile, parent=None):
        QWidget.__init__(self, parent)

        self.movie = QMovie(gifFile, QByteArray(), self)
        size = self.movie.scaledSize()
        self.setGeometry(200, 200, size.width(), size.height())
        self.setWindowTitle(title)
        self.movie_screen = QLabel()
        self.movie_screen.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.movie_screen.setAlignment(Qt.AlignCenter)
        main_layout = QVBoxLayout()
        main_layout.addWidget(self.movie_screen)
        self.setLayout(main_layout)
        self.movie.setCacheMode(QMovie.CacheAll)
        self.movie_screen.setMovie(self.movie)
        self.movie.start()
        self.movie.loopCount()

        button = QPushButton('refresh gif', self)
        button.setToolTip('This is an example button')
        button.move(10,10)
        button.clicked.connect(self.on_click)

    @pyqtSlot()
    def on_click(self):
        self.movie = QMovie(gifFile,QByteArray(), self)
        self.movie_screen.setMovie(self.movie)
        self.movie.start()
        print("done")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    player = GifPlayer("update this gif", gifFile)
    player.show()
sys.exit(app.exec_())

on_click 方法主要是需要更改的。

【讨论】:

以上是关于PyQt5:在 Qmovie 中重新加载 gif的主要内容,如果未能解决你的问题,请参考以下文章

QMovie::setScaledSize() 改变标签大小

在 PyQt4 中显示 Gif 加载

Qt之等待提示框(QMovie)

qt-用label控件加载gif图

QLabel 在 gif 上覆盖 png

python pyqt5 载入gif