【发布时间】:2019-06-27 08:28:04
【问题描述】:
我对 PyQt 完全陌生。我想使用 PyQt5 做动画。这是我正在做的一个简单测试,所以我只是想将一个矩形从窗口的顶部移动到底部。以下是我为实现这一目标所做的工作的要点。
- 1。我已经把我想画的东西放在了paintEvent() 方法中。我已经使用变量而不是常量值绘制了矩形
- 2。我还创建了一个 update() 函数来更新所有变量
- 3。我创建了一个循环函数,它每 100 毫秒调用一次 self.update() 和 self.repaint()
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() 函数中,因为删除 self.loop() 后,我可以在窗口顶部看到带有白色背景的蓝色框的静态图片。
【问题讨论】:
标签: python python-3.x animation pyqt pyqt5