Отображение gif в PyQt GUI с использованием QLabel - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь отобразить загрузочный GIF после нажатия кнопки. Это код, который у меня сейчас есть

import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MainWindow (QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow,self).__init__(parent)
        self.setGeometry(50,50,240,320)
        self.home()
    def home(self):
        but = QtGui.QPushButton("Example", self)#Creates the brew coffee button
        but.clicked.connect(self.gif_display)
        but.resize(200,80)
        but.move(20,50)

        self.show()
    def gif_display(self):
        l = QMovieLabel('loading.gif')
        l.show()

class QMovieLabel(QLabel):
    def __init__(self, fileName):
        QLabel.__init__(self)
        m = QMovie(fileName)
        m.start()
        self.setMovie(m)

    def setMovie(self, movie):
        QLabel.setMovie(self, movie)
        s=movie.currentImage().size()
        self._movieWidth = s.width()
        self._movieHeight = s.height()

def run():
    app = QtGui.QApplication(sys.argv)
    GUI = MainWindow()
    sys.exit(app.exec_())
run()

Я хотел бы отобразить GIF, называемый «loading.gif» после нажатия кнопки. После нажатия кнопки ничего не появляется, и я не уверен, что нужно сделать, чтобы правильно отобразить изображение. Размер GIF соответствует размеру экрана, который я создал (240х320).

1 Ответ

0 голосов
/ 03 ноября 2018

Проблема в том, что QMovieLabel является локальной переменной в gif_display, поэтому она будет удалена после завершения работы функции, поэтому решение состоит в том, чтобы избежать ее удаления. Есть 2 варианта: сделать его атрибутом класса или сделать его дочерним элементом окна, я покажу второй метод, так как я думаю, что это тот, который вам нужен:

import sys
from PyQt4 import QtCore, QtGui

class MainWindow (QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow,self).__init__(parent)
        self.setGeometry(50,50,240,320)
        self.home()

    def home(self):
        but = QtGui.QPushButton("Example", self) # Creates the brew coffee button
        but.clicked.connect(self.gif_display)
        but.resize(200,80)
        but.move(20,50)
        self.show()

    @QtCore.pyqtSlot()
    def gif_display(self):
        l = QMovieLabel('loading.gif', self)
        l.adjustSize()
        l.show()

class QMovieLabel(QtGui.QLabel):
    def __init__(self, fileName, parent=None):
        super(QMovieLabel, self).__init__(parent)
        m = QtGui.QMovie(fileName)
        self.setMovie(m)
        m.start()

    def setMovie(self, movie):
        super(QMovieLabel, self).setMovie(movie)
        s=movie.currentImage().size()
        self._movieWidth = s.width()
        self._movieHeight = s.height()

def run():
    app = QtGui.QApplication(sys.argv)
    GUI = MainWindow()
    sys.exit(app.exec_())

if __name__ == '__main__':
    run()
...