使用PyQt5在python中使用addEllipse移动椭圆
我在一个项目中工作,我应该使用PyQt5绘制移动球。所以我试着移动addElipse的坐标(x,y),但它不想工作 这是我的代码:使用PyQt5在python中使用addEllipse移动椭圆,python,pyqt5,Python,Pyqt5,我在一个项目中工作,我应该使用PyQt5绘制移动球。所以我试着移动addElipse的坐标(x,y),但它不想工作 这是我的代码: import numpy as np from PyQt5 import QtWidgets, QtCore from PyQt5.QtCore import QPropertyAnimation, QRect from PyQt5.QtGui import QPen, QBrush, QColor from PyQt5.QtWidgets import QGrap
import numpy as np
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import QPropertyAnimation, QRect
from PyQt5.QtGui import QPen, QBrush, QColor
from PyQt5.QtWidgets import QGraphicsScene
from mainwindow import Ui_MainWindow
class View(QtWidgets.QMainWindow, Ui_MainWindow):
startSimulationSignal = QtCore.pyqtSignal()
def __init__(self):
super(View, self).__init__()
self.setupUi(self)
self.setWindowTitle('Simulation')
self.scene = QGraphicsScene()
self.graphicsView.setScene(self.scene)
self.pen = QPen()
self.blue_brush = QBrush(QColor(0, 0, 255))
self._green_brush = QBrush(QColor(154, 205, 50))
self.red_brush = QBrush(QColor(178, 34, 34))
self.x = 10 * np.random.random_sample()
self.y = 10 * np.random.random_sample()
self.vx = 10 * np.random.random_sample() / 10
self.vy = 10 * np.random.random_sample() / 10
self.population = 100
self.moving()
self.drawing()
self.collide()
self.doanimation()
def moving(self):
if self.x < 1 or self.x >= 10:
self.vx *= -1
if self.y < 0 or self.y >= 10:
self.vy *= -1
self.x += int(self.vx)
self.y += int(self.vy)
def drawing(self):
# self.population = 100
for i in range(self.population):
self.scene.addEllipse(i * 30, self.x, 30, self.y, self.pen, self.blue_brush)
self.stat = 'not sick'
def collide(self):
for i in range(self.population):
self.dx = self.x + self.vx
self.dy = self.y + self.vy
self.scene.addEllipse(i * 50, self.dx, 30, self.dy, self.pen, self._green_brush)
def doanimation(self):
self.anim = QPropertyAnimation(self.scene) # ,b="geometry")
self.anim.setStartValue(QRect(0, 0, 100, 30))
self.anim.setEndValue(QRect(250, 250, 100, 30))
self.anim.start()
解决方案很简单:创建一种方法,允许使用QVariantAnimation移动项目,其中valueChanged信号更新项目的位置。然后使用完成的信号重新计算新位置:
随机导入
从PyQt5.QtCore导入QAbstractAnimation、QVariantAnimation、QPointF、QRectF
从PyQt5.QtGui导入QPen、QBrush、QColor
从PyQt5.QtWidgets导入(
QApplication,
qp,
Qsscene,
QMainWindow,
)
从主窗口导入Ui\u主窗口
类球(QGraphicsSellipseitem):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.anim=QVariantAnimation()
self.setRect(QRectF(-10,-10,20,20))
self.setPen(QPen())
def移动到(自身、位置、持续时间=1000):
如果self.anim.state()==QAbstractAnimation.Running:
self.anim.stop()
self.anim.setStartValue(self.pos())
self.anim.setEndValue(位置)
self.anim.valueChanged.connect(self.setPos)
self.anim.setDuration(持续时间)
self.anim.start()
类视图(QMainWindow、Ui\U MainWindow):
定义初始化(自):
超级(视图,自我)。\uuuu初始化
self.setupUi(self)
self.setWindowTitle(“模拟”)
self.scene=qgraphicscene()
self.graphicsView.setScene(self.scene)
球的自身数量=10
self.start()
def启动(自):
对于范围内的i(球的自身数量):
ball=ball()
颜色=随机选择(
[QColor(0,0255),QColor(154205,50),QColor(17834,34)]
)
球头立根刷(QBrush(颜色))
ball.anim.finished.connect(lambda项目=ball:self.move\u random(项目))
self.scene.addItem(球)
随机移动(球)
def移动_随机(自身,项目):
pos=QPointF(*随机样本(范围(-100100),2))
项目。移动到(位置)
如果名称=“\uuuuu main\uuuuuuuu”:
app=QApplication([])
视图=视图()
view.show()
app.exec()
请提供@eyllanesc done!仍然缺少主窗口。py@Demi-我上传了它,希望它clear@Sofia您的问题不清楚,例如:您希望球如何移动?。除此之外,你的函数名更容易混淆,“碰撞”函数做什么?谢谢,它非常有用,但是你能告诉我如何知道一个球的坐标吗。再次感谢你@eyllanesc@Sofia使用item.pos()
@Sofia请阅读SO规则:和。在这里,我们不跟进OP的所有问题,但我们只解决了一个特定的问题,因此我将不再回复您的评论
from PyQt5 import QtCore, QtWidgets
from pyqtgraph import PlotWidget
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1456, 835)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(950, 580, 93, 28))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(1120, 580, 93, 28))
self.pushButton_2.setObjectName("pushButton_2")
self.verticalLayoutWidget_2 = QtWidgets.QWidget(self.centralwidget)
self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(90, 100, 361, 231))
self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.verticalLayoutWidget_3 = QtWidgets.QWidget(self.centralwidget)
self.verticalLayoutWidget_3.setGeometry(QtCore.QRect(30, 350, 631, 431))
self.verticalLayoutWidget_3.setObjectName("verticalLayoutWidget_3")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_3)
self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setGeometry(QtCore.QRect(750, 530, 120, 80))
self.widget.setObjectName("widget")
self.graphWidget = PlotWidget(self.centralwidget)
self.graphWidget.setGeometry(QtCore.QRect(720, 40, 491, 381))
self.graphWidget.setObjectName("graphWidget")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1456, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
self.graphicsView.setGeometry(QtCore.QRect(10, 40, 601, 411))
self.graphicsView.setObjectName("graphicsView")
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Start"))
self.pushButton_2.setText(_translate("MainWindow", "Pause"))