python - PyQt5:在 Qmovie 中重新加载 gif
问题描述
我将如何在 PyQt5 中重新加载新的动画 gif 文件?
我想做的事:
- 负载测试.gif
- 播放测试.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_())
解决方案
事实证明,这是一个从根本上容易解决的问题。该错误试图仅刷新 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 方法主要是需要更改的。
推荐阅读
- php - 使用 php 在 pgadmin 上更改密码的问题
- typescript - Typescript - 要输入的字符串
- css - Vue:类的条件渲染
- reactjs - 使用 apollo 钩子和过多重新渲染的一般建议
- reactjs - React:同一组件的多个实例配置不同
- symfony - 使用表单事件添加的字段用于 symfony 中的集合项
- ubuntu - glx 和 xrandr 版本是否属于远程桌面环境中客户端的硬件?
- c# - c# 基于Xpath生成XML文档
- mysql - mysql控制台中提供的密码问题
- javascript - 使用 Bokeh RadioGroup 在 Jupyter 中绘制选定的 Pandas DataFrame 子集