我有类似图表的东西,我遇到了麻烦。 我需要绘制雪人,它在余弦轨迹上移动。
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,但在我的代码中有一些难以使用,我没有经验,我相信,这个问题解决得更容易。
答案 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_()