【问题标题】:gif doesn't play when button is pressed PyQt5按下按钮时 gif 不播放 PyQt5
【发布时间】:2020-04-20 01:43:34
【问题描述】:

我的目标是在按下按钮时播放 gif,但由于某种原因它不起作用。我认为值得一提的是,该按钮可以使用self.movie.stop() 停止动画,但它对self.movie.start() 根本不起作用,我确信该按钮确实调用了该函数,因为我放入了打印语句,但self.movie.start() 不起作用

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton
from PyQt5.QtCore import Qt, QTimer, QSize
from PyQt5.QtGui import QMovie

class APP(QWidget):
    def __init__(self):
        super().__init__()
        self.setStyleSheet("background-color: white;")
        self.setGeometry(0, 0, 300, 300)

        self.movie = QMovie(r'C:\Users\Name\Desktop\Desktop\de.gif')
        self.movie.setScaledSize(QSize(300,225))

        self.btn = QPushButton(self)
        self.btn.clicked.connect(self.strt)
        self.btn.setGeometry(100,130,150,50)

        self.label = QLabel(self)
        self.label.setMovie(self.movie)

        self.show()

    def strt(self):
        print("Button pressed")
        self.movie.start()


app = QApplication(sys.argv)
demo = APP()
app.exit(app.exec())

【问题讨论】:

  • 我很困惑。你说你可以停止动画,但是你怎么知道它没有开始呢?
  • 对不起,如果我将self.movie.start() 放在主块中,动画确实会开始,但是一旦我放入strt()function,它就不会像我想要的那样开始。
  • 我猜如果您按照建议的答案使用self.movie.jumpToFrame(0),它也适用于您的代码,对吧?
  • 是的,幸运的是,它确实按预期工作,我猜当我不调用 jumpToFrame() 函数时,gif 没有加载,因为当我试图让它工作时,每个当我运行代码时它给了我一个黑屏。
  • 我将在一个单独的答案中解释它,因为当前的答案对这种行为的原因并不是很具体。

标签: python pyqt5


【解决方案1】:

bool QMovie::jumpToFrame(int frameNumber)

跳转到帧号frameNumber。成功返回真;否则返回 false。

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton
from PyQt5.QtCore import Qt, QTimer, QSize
from PyQt5.QtGui import QMovie

class APP(QWidget):
    def __init__(self):
        super().__init__()
        self.setStyleSheet("background-color: white;")
        self.setGeometry(0, 0, 300, 300)

#        self.movie = QMovie(r'C:\Users\Name\Desktop\Desktop\de.gif')
        self.movie = QMovie(self)                                       # + self
        self.movie.setFileName('D:/_Qt/__Qt/img/Fo2BxBK.gif')           # +
        self.movie.setScaledSize(QSize(300,225))
        self.movie.jumpToFrame(0)                                       # +

        self.label = QLabel(self)                                       # +
        self.label.setMovie(self.movie)                                 # +
        
        self.btn = QPushButton("Start", self)
        self.btn.setCheckable(True)                                     # +
        self.btn.clicked.connect(self.strt)
        self.btn.setGeometry(100,230,150,50)

#        self.label = QLabel(self)
#        self.label.setMovie(self.movie)

        self.show()

    def strt(self, state):                                               # + state
        print("Button pressed", state)
        if state:
            self.movie.start()
            self.btn.setText("Stop")
        else:
            self.movie.stop()
            self.btn.setText("Start")


app = QApplication(sys.argv)
demo = APP()
app.exit(app.exec())

【讨论】:

  • 实际上,jumpToFrame() 仅确保第一帧已加载并在开始时正确显示,但这并不是 OP 询问行为的确切原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 2014-11-02
  • 2015-05-01
相关资源
最近更新 更多