如何在pyqt中更新图形之类的东西

时间:2016-01-03 23:20:22

标签: python pyqt

我有类似图表的东西,我遇到了麻烦。 我需要绘制雪人,它在余弦轨迹上移动。

import sys
import math
import time
from PyQt4 import QtGui, QtCore
class MyFrame(QtGui.QGraphicsView):
    def __init__( self, parent = None ):
        super(MyFrame, self).__init__(parent)
        self.resize(800,600)
        scene = QtGui.QGraphicsScene()
        self.setScene(scene)

        for x in range(100):

            y = 100*(math.cos(x+200))

            pen1   = QtGui.QPen(QtGui.QColor(QtCore.Qt.red))
            brush1 = QtGui.QBrush(pen1.color().darker(255))
            item1 = scene.addEllipse(x, y, 100, 100, pen1,brush1)

            pen2   = QtGui.QPen(QtGui.QColor(QtCore.Qt.green))
            brush2 = QtGui.QBrush(pen2.color().darker(150))
            item2 = scene.addEllipse(x-25, y+100, 150, 150, pen2,brush2)

            pen3   = QtGui.QPen(QtGui.QColor(QtCore.Qt.blue))
            brush3 = QtGui.QBrush(pen3.color().darker(150))
            item3 = scene.addEllipse(x-50, y+250, 200, 200, pen3,brush3)
            time.sleep(3)



app = QtGui.QApplication([])
f = MyFrame()
f.show()
app.exec_()

现在我有一些问题。 当我使用time.sleep(2)时,它只是等待几秒钟,并向我展示没有步骤的最终结果。 1)我需要做些什么来修复它? 2)当它看起来像移动动画时,我需要做什么? 我尝试使用QPoint,但在我的代码中有一些难以使用,我没有经验,我相信,这个问题解决得更容易。

1 个答案:

答案 0 :(得分:1)

首先,您正在使用__init__方法制作动画,这意味着在您展示框架之前,整个过程将完成。而是将其分解为您在f.show()之后调用的单独方法。

第二次,您需要在动画期间投放processEvents()来强制qt重绘屏幕。

第三次,您可能希望清除图纸之间的场景。

import sys
import math
import time
from PyQt4 import QtGui, QtCore
class MyFrame(QtGui.QGraphicsView):
    def __init__( self, parent = None ):
        super(MyFrame, self).__init__(parent)
        self.resize(800,600)
        self.scene = QtGui.QGraphicsScene()
        self.setScene(self.scene)

    def doAnimation(self):
        for x in range(5):

            self.scene.clear();
            y = 100*(math.cos(x+200))

            pen1   = QtGui.QPen(QtGui.QColor(QtCore.Qt.red))
            brush1 = QtGui.QBrush(pen1.color().darker(255))
            item1 = self.scene.addEllipse(x, y, 100, 100, pen1,brush1)

            pen2   = QtGui.QPen(QtGui.QColor(QtCore.Qt.green))
            brush2 = QtGui.QBrush(pen2.color().darker(150))
            item2 = self.scene.addEllipse(x-25, y+100, 150, 150, pen2,brush2)

            pen3   = QtGui.QPen(QtGui.QColor(QtCore.Qt.blue))
            brush3 = QtGui.QBrush(pen3.color().darker(150))
            item3 = self.scene.addEllipse(x-50, y+250, 200, 200, pen3,brush3)

            QtGui.QApplication.processEvents()
            time.sleep(1)

app = QtGui.QApplication([])
f = MyFrame()
f.show()
f.doAnimation()
app.exec_()