我对PyQt完全陌生。我想用PyQt5做动画,这是一个简单的测试,所以我只想把一个矩形从窗口的顶部移到底部。这里有一个要点,我正在做什么来实现这一点。在
import sys
import random
from PyQt5.QtWidgets import ( QApplication, QWidget, QToolTip, QMainWindow)
from PyQt5.QtGui import QPainter, QBrush, QPen, QColor, QFont
from PyQt5.QtCore import Qt, QDateTime
class rain_animation(QMainWindow):
def __init__(self):
super().__init__()
self.painter = QPainter()
""" Variables for the Window """
self.x = 50
self.y = 50
self.width = 500
self.height = 500
"""Variables for the rain"""
self.rain_x = self.width/2
self.rain_y = 0
self.rain_width = 5
self.rain_height = 30
self.rain_vel_x = 0
self.rain_vel_y = 5
self.start()
self.loop()
def paintEvent(self, a0):
self.painter.begin(self)
# Draw a White Background
self.painter.setPen(QPen(Qt.white, 5, Qt.SolidLine))
self.painter.setBrush(QBrush(Qt.white, Qt.SolidPattern))
self.painter.drawRect(0, 0, self.width, self.height)
#Draw the rain
self.painter.setPen(QPen(Qt.blue, 1, Qt.SolidLine))
self.painter.setBrush(QBrush(Qt.blue, Qt.SolidPattern))
self.painter.drawRect(self.rain_x, self.rain_y, self.rain_width, self.rain_height)
self.painter.end(self)
def update(self, diff):
self.rain_x += self.rain_vel_x
self.rain_y += self.rain_vel_y
def start(self):
self.setWindowTitle("Rain Animation")
self.setGeometry(self.x, self.y, self.width, self.height)
self.show()
def loop(self):
start = QDateTime.currentDateTime()
while True :
diff = start.msecsTo(QDateTime.currentDateTime())
if diff >= 100 :
print("time : {0} ms rain_x : {1} rain_y : {2}".format(diff, self.rain_x, self.rain_y))
start = QDateTime.currentDateTime()
self.update(diff)
self.repaint()
if __name__ == "__main__":
app = QApplication(sys.argv)
animation = rain_animation()
sys.exit(app.exec_())
我应该看到的是一个从窗口顶部移动到屏幕底部的矩形,但我看到的只是一个黑色背景的窗口。
loop()函数似乎工作正常,因为我打印的数据显示变量每100毫秒更新一次。
不过,问题似乎出在loop()函数中,因为在删除自循环()我可以看到一张蓝色盒子的静态图片,它的背景是白色的,在窗口的顶部。在
问题:
有一个连续的循环不允许GUI执行诸如绘制、与操作系统交互等任务。每个GUI都提供了一种以不阻塞窗口的方式制作动画的方法。在
Qt提供了各种类,允许您将动画实现为:
另一方面,建议:
考虑到上述情况,最好使用QPropertyAnimation:
另一个选项是使用qvarianimation:
^{pr2}$以下示例使用您的逻辑,但带有一个QTimer:
相关问题 更多 >
编程相关推荐