【问题标题】:Python Pyqt Add background gifPython Pyqt 添加背景gif
【发布时间】:2017-01-18 00:31:27
【问题描述】:

我正在尝试在我的代码后面添加一个 gif,我似乎无法让它在这里工作是我正在使用的代码

import sys
import webbrowser
import random
import time
import os
import subprocess
from PyQt4.QtCore import QSize, QTimer
from PyQt4.QtGui import QApplication, QMainWindow, QPushButton, QWidget, QIcon, QLabel, QPainter, QPixmap, QMessageBox, QAction, QKeySequence, QFont, QFontMetrics, QMovie 
from PyQt4 import QtGui


class UIWindow(QWidget):
    def __init__(self, parent=None):
        super(UIWindow, self).__init__(parent)
        self.resize(QSize(600, 750))
        self.ToolsBTN = QPushButton('tab', self)
        self.ToolsBTN.resize(100,40)
        self.ToolsBTN.move(60, 300)

        self.CPS = QPushButton('tab1', self)
        self.CPS.resize(100,40)
        self.CPS.move(130,600)

        self.Creator = QPushButton('tab2', self)
        self.Creator.resize(100,40)
        self.Creator.move(260, 50)

class MainWindow(QMainWindow,):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setGeometry(50, 50, 600, 750)
        self.setFixedSize(600, 750)
        self.startUIWindow()
    def startUIWindow(self):
        self.Window = UIWindow(self)
        self.setWindowTitle("My Program")
      self.show()

if __name__ == '__main__':
   app = QApplication(sys.argv)
   w = MainWindow()
   sys.exit(app.exec_())

这就是我现在所拥有的一切,我正试图让我的 Dance.gif 在后面播放,但如果有人能帮我解决这个问题,这对我不起作用,那就太棒了!

【问题讨论】:

标签: python pyqt pyqt4 pyqt5


【解决方案1】:

您必须使用 QMovie 重现电影,并且每次更改图像时您都必须使用当前像素图刷新背景。

__ init __函数中添加下一个代码:

self.movie = QMovie("{filename}.gif")
self.movie.frameChanged.connect(self.repaint)
self.movie.start()

我们实现了paintEvent函数:

def paintEvent(self, event):
    currentFrame = self.movie.currentPixmap()
    frameRect = currentFrame.rect()
    frameRect.moveCenter(self.rect().center())
    if frameRect.intersects(event.rect()):
        painter = QPainter(self)
        painter.drawPixmap(frameRect.left(), frameRect.top(), currentFrame)

完整代码:

import sys
from PyQt5.QtCore import QSize
from PyQt5.QtGui import QMovie, QPainter, QPixmap
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget


class UIWindow(QWidget):
    def __init__(self, parent=None):
        super(UIWindow, self).__init__(parent)
        self.resize(QSize(600, 750))
        self.ToolsBTN = QPushButton('tab', self)
        self.ToolsBTN.resize(100, 40)
        self.ToolsBTN.move(60, 300)

        self.CPS = QPushButton('tab1', self)
        self.CPS.resize(100, 40)
        self.CPS.move(130, 600)

        self.Creator = QPushButton('tab2', self)
        self.Creator.resize(100, 40)
        self.Creator.move(260, 50)


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setGeometry(50, 50, 600, 750)
        self.setFixedSize(600, 750)
        self.startUIWindow()

        self.movie = QMovie("animated-dancing-image-0028.gif")
        self.movie.frameChanged.connect(self.repaint)
        self.movie.start()

    def startUIWindow(self):
        self.Window = UIWindow(self)
        self.setWindowTitle("My Program")
        self.show()

    def paintEvent(self, event):
        currentFrame = self.movie.currentPixmap()
        frameRect = currentFrame.rect()
        frameRect.moveCenter(self.rect().center())
        if frameRect.intersects(event.rect()):
            painter = QPainter(self)
            painter.drawPixmap(frameRect.left(), frameRect.top(), currentFrame)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    sys.exit(app.exec_())

GIF:

输出:

【讨论】:

    【解决方案2】:

    我使用这个类实现了这一点......

    class backgroundView(QGraphicsView):
        def __init__ (self,movie):
            super(backgroundView,self).__init__()
            self.movie=movie
            self.display_pixmap=movie.currentPixmap()
            self.setStyleSheet('QGraphicsView {background-color: rgb(0,0,0);}')
    
        def paintEvent(self,event):
            self.display_pixmap = self.movie.currentPixmap().scaled(self.my_size)
            painter=QPainter()
            painter.begin(self.viewport())
            painter.fillRect(event.rect(),self.palette().color(QPalette.Window))
            x = (self.width() - self.display_pixmap.width())/2
            y = (self.height() - self.display_pixmap.height())/2
            painter.drawPixmap(x, y, self.display_pixmap)
            painter.end()
    
        def resizeEvent(self, event):
            self.my_size=event.size()
    

    然后主窗口类看起来像这样......

    class MainWindow(QMainWindow):
        def __init__(self):
            view=backgroundView(self.movie)
            mainLayout=QVBoxLayout()
            self.setCentralWidget(view)
            view.setLayout(mainLayout)
            button=QPushButton('Button')
            mainLayout.addWidget(button)
            self.movie.frameChanged.connect(view.update)
            self.movie.start()
            self.show()
    

    这将用您的 GIF 填充背景,并将其缩放到窗口的大小。 我从我发现here的背景图像中使用的一个类改编了这个。我不知道为什么,但除非您设置视图的样式表,否则它不会重新绘制。

    【讨论】:

      猜你喜欢
      • 2016-01-09
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 2021-03-26
      • 2018-12-22
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多