如何用PyQt5模拟实现网页鼠标移动特效
发表于:2024-11-28 作者:千家信息网编辑
千家信息网最后更新 2024年11月28日,这篇"如何用PyQt5模拟实现网页鼠标移动特效"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看
千家信息网最后更新 2024年11月28日如何用PyQt5模拟实现网页鼠标移动特效
这篇"如何用PyQt5模拟实现网页鼠标移动特效"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"如何用PyQt5模拟实现网页鼠标移动特效"文章吧。
核心代码:
from random import randomfrom time import timefrom PyQt5.QtCore import QPropertyAnimation, QObject, pyqtProperty, QEasingCurve,\ Qt, QRectF, pyqtSignalfrom PyQt5.QtGui import QColor, QPainterPath, QPainterfrom PyQt5.QtWidgets import QWidget__Author__ = """By: IronyQQ: 892768447Email: 892768447@qq.com"""__Copyright__ = 'Copyright (c) 2018 Irony'__Version__ = 1.0try: import pointtool # @UnusedImport @UnresolvedImport getDistance = pointtool.getDistance findClose = pointtool.findCloseexcept: import math def getDistance(p1, p2): return math.pow(p1.x - p2.x, 2) + math.pow(p1.y - p2.y, 2) def findClose(points): plen = len(points) for i in range(plen): closest = [None, None, None, None, None] p1 = points[i] for j in range(plen): p2 = points[j] dte1 = getDistance(p1, p2) if p1 != p2: placed = False for k in range(5): if not placed: if not closest[k]: closest[k] = p2 placed = True for k in range(5): if not placed: if dte1 < getDistance(p1, closest[k]): closest[k] = p2 placed = True p1.closest = closestclass Target: def __init__(self, x, y): self.x = x self.y = yclass Point(QObject): valueChanged = pyqtSignal() def __init__(self, x, ox, y, oy, *args, **kwargs): super(Point, self).__init__(*args, **kwargs) self.__x = x self._x = x self.originX = ox self._y = y self.__y = y self.originY = oy # 5个闭合点 self.closest = [0, 0, 0, 0, 0] # 圆半径 self.radius = 2 + random() * 2 # 连线颜色 self.lineColor = QColor(156, 217, 249) # 圆颜色 self.circleColor = QColor(156, 217, 249) def initAnimation(self): # 属性动画 if not hasattr(self, 'xanimation'): self.xanimation = QPropertyAnimation( self, b'x', self, valueChanged=self.valueChanged.emit, easingCurve=QEasingCurve.InOutSine) self.yanimation = QPropertyAnimation( self, b'y', self, valueChanged=self.valueChanged.emit, easingCurve=QEasingCurve.InOutSine, finished=self.updateAnimation) self.updateAnimation() def updateAnimation(self): self.xanimation.stop() self.yanimation.stop() duration = (1 + random()) * 1000 self.xanimation.setDuration(duration) self.yanimation.setDuration(duration) self.xanimation.setStartValue(self.__x) self.xanimation.setEndValue(self.originX - 50 + random() * 100) self.yanimation.setStartValue(self.__y) self.yanimation.setEndValue(self.originY - 50 + random() * 100) self.xanimation.start() self.yanimation.start() @pyqtProperty(float) def x(self): return self._x @x.setter def x(self, x): self._x = x @pyqtProperty(float) def y(self): return self._y @y.setter def y(self, y): self._y = yclass Window(QWidget): def __init__(self, *args, **kwargs): super(Window, self).__init__(*args, **kwargs) self.setMouseTracking(True) self.resize(800, 600) self.points = [] self.target = Target(self.width() / 2, self.height() / 2) self.initPoints() def paintEvent(self, event): super(Window, self).paintEvent(event) painter = QPainter() painter.begin(self) painter.setRenderHint(QPainter.Antialiasing) painter.fillRect(self.rect(), Qt.black) self.animate(painter) painter.end() def mouseMoveEvent(self, event): super(Window, self).mouseMoveEvent(event) # 鼠标移动时更新xy坐标 self.target.x = event.x() self.target.y = event.y() self.update() def initPoints(self): t = time() self.points.clear() # 创建点 stepX = self.width() / 20 stepY = self.height() / 20 for x in range(0, self.width(), int(stepX)): for y in range(0, self.height(), int(stepY)): ox = x + random() * stepX oy = y + random() * stepY point = Point(ox, ox, oy, oy) point.valueChanged.connect(self.update) self.points.append(point) print(time() - t) t = time() # 每个点寻找5个闭合点 findClose(self.points) print(time() - t) def animate(self, painter): for p in self.points: # 检测点的范围 value = abs(getDistance(self.target, p)) if value < 4000: # 其实就是修改颜色透明度 p.lineColor.setAlphaF(0.3) p.circleColor.setAlphaF(0.6) elif value < 20000: p.lineColor.setAlphaF(0.1) p.circleColor.setAlphaF(0.3) elif value < 40000: p.lineColor.setAlphaF(0.02) p.circleColor.setAlphaF(0.1) else: p.lineColor.setAlphaF(0) p.circleColor.setAlphaF(0) # 画线条 if p.lineColor.alpha(): for pc in p.closest: if not pc: continue path = QPainterPath() path.moveTo(p.x, p.y) path.lineTo(pc.x, pc.y) painter.save() painter.setPen(p.lineColor) painter.drawPath(path) painter.restore() # 画圆 painter.save() painter.setPen(Qt.NoPen) painter.setBrush(p.circleColor) painter.drawRoundedRect(QRectF( p.x - p.radius, p.y - p.radius, 2 * p.radius, 2 * p.radius), p.radius, p.radius) painter.restore() # 开启动画 p.initAnimation()if __name__ == '__main__': import sys import cgitb sys.excepthook = cgitb.enable(1, None, 5, '') from PyQt5.QtWidgets import QApplication app = QApplication(sys.argv) w = Window() w.show() sys.exit(app.exec_())
运行结果如下:
以上就是关于"如何用PyQt5模拟实现网页鼠标移动特效"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。
内容
鼠标
移动
特效
网页
颜色
动画
就是
文章
知识
篇文章
p.y
闭合
代码
价值
半径
坐标
大部分
属性
更多
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发过程记录表
我的世界服务器如何警告玩家
非洲网络安全2011
网络安全宣传活动感受
zdb 数据库
计算机网络技术能去的院校
湖南鑫鑫网络技术公司
软件开发公司会制作客户端吗
上海便宜软件开发价格咨询
服务器管理中根域的名称
多媒体通信网络技术英文
鹤壁网络安全工程师的工资
点菜小程序个性化软件开发支持
服务器安装杀毒软件的作用
如何获取网上服务器
把诗词建立数据库
阿里云有台湾服务器吗
武汉 网络安全 政策
人事软件开发需求分析文档
高端数据库技术
泰拉瑞亚手机版服务器怎么登录
2022年网络安全进校园动漫
晋城大屏互动软件开发公司
阳江小程序软件开发
网络安全反诈骗讲座宣传文案
plsql插入数据库缺失逗号
win8的服务器管理在哪里
软件开发logo文字说明
怎么查询数据库累加
摩尔庄园没有服务器