PyQt5: перезагрузка GIF в Qmovie - PullRequest
0 голосов
/ 02 июня 2018

Как мне перезагружать новый анимированный GIF-файл в PyQt5?

Что я хочу сделать:

  1. load test.gif
  2. play test.gif
  3. перезаписать исходный файл test.gif другим произвольным анимированным gif
  4. сделать, чтобы Qmovie перезагрузил gif при нажатии кнопки
  5. отобразил новый 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_())

1 Ответ

0 голосов
/ 15 июня 2018

Это оказалось принципиально легко исправить.Ошибка пыталась просто обновить экран 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 был в первую очередь тем, что нужно было изменить.

...