绘制太极图 - 使用 PyQt

大家好!今天我们将一起来探讨一下如何使用PyQt,这是一个强大的Python库,来绘制一个传统的太极图。这个图案代表着古老的阴阳哲学,而我们的代码将以大白话的方式向你揭示它的奥秘。

PyQt:是什么鬼?

首先,我们得了解一下PyQt。它是一个Python库,让你能够创建漂亮、跨平台的桌面应用程序。要记住的一点是,它基于Qt,这是一个功能强大的图形用户界面框架。

代码的开胃菜

好的,现在让我们来看看代码的一些小细节。
 

class TaiChiWidget(QWidget):def __init__(self):super().__init__()self.setGeometry(100, 100, 200, 200)self.setWindowTitle('Tai Chi with Bezier Curve')

这里我们定义了一个名为 TaiChiWidget 的类,继承自 QWidget。在这个类的构造函数中,我们设置了窗口的大小和标题。

绘制鱼形,添阴阳

接下来的绘图操作是代码的精华。

def paintEvent(self, event):painter = QPainter(self)painter.rotate(30)painter.setRenderHint(QPainter.Antialiasing)path = QPainterPath()# 绘制 左侧黑鱼c = QPointF(50, 50)rect = QRectF(0, 0, 100, 100)path.moveTo(c)path.arcTo(rect, 90.0, 180.0)path.arcTo(QRectF(25, 50, 50, 50), -90, 180.0)path.arcTo(QRectF(25, 0, 50, 50), -90, -180.0)

这段代码通过创建一个 QPainter 对象,实现了旋转、抗锯齿等效果。然后,通过 QPainterPath 对象,使用一系列的 arcTo 操作,巧妙地画出了太极图的左半部分——黑鱼的形状。

白色大圆圈和小鱼眼

# 绘制白色大圆圈
painter.setBrush(Qt.white)
painter.setPen(Qt.white)
painter.drawEllipse(QPointF(50, 50), 50, 50)
painter.fillPath(path, QBrush(Qt.black))# 绘制两个小圆圈(鱼眼)
painter.setPen(Qt.white)
painter.drawEllipse(QPointF(50, 75), 7, 7)
painter.setBrush(Qt.black)
painter.setPen(Qt.black)
painter.drawEllipse(QPointF(50, 25), 7, 7)
painter.setPen(QPen(Qt.black, 2))

这部分代码用于绘制太极图的右半部分,即白色的大圆圈和两个小黑白鱼眼。通过设置画刷和画笔的颜色,巧妙地营造出阴阳的对比。

完整代码

import sys
from PyQt5.QtGui import QPainter, QPainterPath, QBrush, QPen, QColor, QTransform
from PyQt5.QtCore import Qt, QPointF, QRectF
from rotate_widget import RotatedWidget
from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QGraphicsProxyWidget, QPushButton, QLabel, \QVBoxLayout, QWidget
from PyQt5.QtCore import Qtclass TaiChiWidget(QWidget):def __init__(self):super().__init__()self.setGeometry(100, 100, 200, 200)self.setWindowTitle('Tai Chi with Bezier Curve')def paintEvent(self, event):painter = QPainter(self)painter.setRenderHint(QPainter.Antialiasing)path = QPainterPath()# 绘制 左侧黑鱼c = QPointF(50, 50)rect = QRectF(0, 0, 100, 100)path.moveTo(c)path.arcTo(rect, 90.0, 180.0)path.arcTo(QRectF(25, 50, 50, 50), -90, 180.0)path.arcTo(QRectF(25, 0, 50, 50), -90, -180.0)# 绘制白色大圆圈painter.setBrush(Qt.white)painter.setPen(Qt.white)painter.drawEllipse(QPointF(50, 50), 50, 50)painter.fillPath(path, QBrush(Qt.black))# 绘制两个小圆圈(鱼眼)painter.setPen(Qt.white)painter.drawEllipse(QPointF(50, 75), 7, 7)painter.setBrush(Qt.black)painter.setPen(Qt.black)painter.drawEllipse(QPointF(50, 25), 7, 7)painter.setPen(QPen(Qt.black, 2))def test():app = QApplication(sys.argv)tai_chi_widget = TaiChiWidget()tai_chi_widget.show()sys.exit(app.exec_())if __name__ == '__main__':test()

增加旋转功能

import sys
from PyQt5.QtGui import QPainter, QPainterPath, QBrush, QPen, QColor, QTransform
from PyQt5.QtCore import Qt, QPointF, QRectF
from rotate_widget import RotatedWidget
from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QGraphicsProxyWidget, QPushButton, QLabel, \QVBoxLayout, QWidget
from PyQt5.QtCore import Qtclass RotatedWidget(QGraphicsView):def __init__(self, content_widget, angle, parent=None):super().__init__(parent)self.angle = anglescene = QGraphicsScene(self)self.setScene(scene)# 创建 QGraphicsProxyWidgetself.proxy_widget = QGraphicsProxyWidget()self.proxy_widget.setWidget(content_widget)self.proxy_widget.setTransformOriginPoint(content_widget.width() / 2, content_widget.height() / 2)scene.addItem(self.proxy_widget)self.rotate(self.angle)self.startTimer(1000/60)def timerEvent(self, a0):self.angle -= 1self.rotate(self.angle)self.update()def rotate(self, angle):self.proxy_widget.setRotation(angle)class TaiChiWidget2(QWidget):def __init__(self):super().__init__()self.radius = 100self.setGeometry(100, 100, 200, 200)self.setStyleSheet("background-color: white;")self.setWindowTitle('Tai Chi with Bezier Curve')def paintEvent(self, event):painter = QPainter(self)painter.setRenderHint(QPainter.Antialiasing)painter.setPen(QPen(Qt.black, 0.5))path = QPainterPath()# 绘制 左侧黑鱼c = QPointF(self.radius, self.radius)rect = QRectF(0, 0, self.radius * 2, self.radius * 2)path.moveTo(c)path.arcTo(rect, 90.0, 180.0)path.arcTo(QRectF(self.radius / 2, self.radius, self.radius, self.radius), -90, 180.0)path.arcTo(QRectF(self.radius / 2, 0, self.radius, self.radius), -90, -180.0)# 绘制白色大圆圈painter.setBrush(Qt.white)painter.drawEllipse(QPointF(self.radius, self.radius), self.radius, self.radius)painter.fillPath(path, QBrush(Qt.black))# 绘制两个小圆圈(鱼眼)painter.setPen(Qt.white)painter.drawEllipse(QPointF(self.radius, self.radius * 3 / 2), self.radius * 0.15, self.radius * 0.15)painter.setBrush(Qt.black)painter.setPen(Qt.black)painter.drawEllipse(QPointF(self.radius, self.radius / 2), self.radius * 0.15, self.radius * 0.15)def test():app = QApplication(sys.argv)tai_chi_widget = TaiChiWidget2()t = RotatedWidget(tai_chi_widget, 60)t.show()sys.exit(app.exec_())if __name__ == '__main__':test()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/648585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构师之路(十六)计算机网络(传输层)

前置知识(了解):计算机基础。 作为架构师,我们所设计的系统很少为单机系统,因此有必要了解计算机和计算机之间是怎么联系的。局域网的集群和混合云的网络有啥区别。系统交互的时候网络会存在什么瓶颈。 既然网络层已经…

.net访问oracle数据库性能问题

问题: 生产环境相同的inser语句在别的非.NET程序相应明显快于.NET程序,执行时间相差比较大,影响正常业务运行,测试环境反而正常。 问题详细诊断过程 问题初步判断诊断过程: 查询插入慢的sql_id 检查对应的执行计划…

直播间流程解析基础

通过用户心理需求引导用户行为 贯穿内容和产品牵引想要和需要 直播间内流程解析 分为播前准备、开播暖场、产品介绍、穿插活动、结尾预告 (1)直播间内流程解析----播前准备 (2)直播间内流程解析----开播暖场 (3&…

互联网加竞赛 基于机器视觉的银行卡识别系统 - opencv python

1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的银行卡识别算法设计 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng…

电涌保护器(SPD)、后备保护器(SCB)、断路器(CB)的区别与应用

随着现代电力系统的不断发展,电力设备的保护显得愈发重要。其中,电涌保护器(SPD)、后备保护器(SCB)和断路器(CB)是三种常见的保护设备,但它们各自具有不同的功能和特点。…

【渗透测试】借助PDF进行XSS漏洞攻击

简介 在平时工作渗透测试一个系统时,常常会遇到文件上传功能点,其中大部分会有白名单或者黑名单机制,很难一句话木马上传成功,而PDF则是被忽略的一个点,可以让测试报告更丰富一些。 含有XSS的PDF制作步骤 1. 编辑器…

论文阅读《thanking frequency fordeepfake detection》

项目链接:https://github.com/yyk-wew/F3Net 这篇论文从频域的角度出发,提出了频域感知模型用于deepfake检测的模型 整体架构图: 1.FAD: 频域感知分解,其实就是利用DCT变换,将空间域转换为频域&#xff…

element+vue 之 v-limit 按钮操作权限

1.新建一个permission.js文件 import store from /storeexport default {inserted: function (el, binding) {const { perms: limits } store.state.userconst { value: params } bindingif (!limits.length) returnif (params && Array.isArray(params)) {if (!limi…

08.Elasticsearch应用(八)

Elasticsearch应用(八) 1.为什么需要相关性算分 我们在文档搜索的时候,匹配程度越高的相关性算分越高,算分越高的越靠前,但是有时候我们不需要算分越高越靠前我们可能需要手动影响算分来控制顺序比如广告&#xff08…

2016年认证杯SPSSPRO杯数学建模A题(第一阶段)洗衣机全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 A题 洗衣机 原题再现: 洗衣机是普及率极高的家用电器,它给人们的生活带来了很大的方便。家用洗衣机从工作方式来看,有波轮式、滚筒式、搅拌式等若干种类。在此基础上,各厂商也推出了多种具体方案…

微信小程序(十五)自定义导航栏

注释很详细,直接上代码 上一篇 新增内容: 1.组件文件夹创建方法 2.自定义组件的配置方法 3.外部修改组件样式(关闭样式隔离或传参) 创建组件文件夹 如果是手动创建建议注意在json文件声明: mynav.json {//声明为组件可…

从CDN了解到的边缘计算与前端渲染

文章概叙 本文代码量较少,讲的是在云开发的基础上使用边缘计算的,代码量不高,​建议看完理解下就可以丢了,知道个概念就好。 废话1 第一次接触边缘计算是在2020年的时候,公司的cloud课程中,有一些相关概…

php二次开发股票系统代码:腾讯股票数据接口地址、批量获取股票信息、转换为腾讯接口指定的股票格式

1、腾讯股票数据控制器 <?php namespace app\index\controller;use think\Model; use think\Db;const BASE_URL http://aaaaaa.aaaaa.com; //腾讯数据地址class TencentStocks extends Home { //里面具体的方法 }2、请求接口返回内容 function juhecurl($url, $params f…

力扣刷题 第十二 边权重均等查询

现有一棵由 n 个节点组成的无向树&#xff0c;节点按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges &#xff0c;其中 edges[i] [ui, vi, wi] 表示树中存在一条位于节点 ui 和节点 vi 之间、权重为 wi 的边。 另给你一个长度为 m 的二维整数数…

【前端基础--4】

定位属性 position 可以将元素定位到你想要放到位置&#xff0c;使用方位值来进行移动(top,left,right,bottom)。 1.相对定位 position: relative; top: 20px; left: 20px; 以自身为定点进行移动&#xff0c;不会脱离文档流。 不会影响元素本身的性质&#xff1b;块级…

性能优化-OpenCL 介绍

「发表于知乎专栏《移动端算法优化》」 本文首先对 GPU 进行了概述&#xff0c;然后着重地对移动端的 GPU 进行了分析&#xff0c;随后我们又详细地介绍了 OpenCL 的背景知识和 OpenCL 的四大编程模型。希望能帮助大家更好地进行移动端高性能代码的开发。 &#x1f3ac;个人简介…

RisingWave 多流 Join 实现高效实时数据打宽

在公司业务场景中&#xff0c;通常需要使用流计算引擎从多个数据源获取数据、进行 ETL 操作&#xff0c;并将清洗后的数据导入到数据分析系统或数据湖中。由于最后产生出来的表是一张宽表&#xff0c;我们通常也称这个过程为“数据打宽“。 数据打宽在流处理系统中对应的操作便…

Fiddler 过滤地址设置及导出JMeter脚本插件原理

Fiddler 过滤地址设置 1、在fiddler右边工具栏中找到Filters过滤器->勾选&#xff1a;Use Filters->在hosts中选择过滤规则和要过滤的地址。 如下图&#xff1a; 2、点击【Actions】按钮&#xff0c;选择&#xff1a;Run Filterset now&#xff0c;就会立即生效&#x…

nginx限制ip访问

先看一下被禁止的效果 如何配置 禁止访问的话直接在location模块增加类似如下配置 deny all; 完整示例 location / {deny all;root html;index index.html index.htm;} 默认是allow all就是允许所有ip访问,如果只配置指定ip可以访问是无效的,还是所有的ip可以访问 无效示例…

Unity动画桢事件

1&#xff0c;使用原因 在新项目内部审核的时候&#xff0c;说什么动画节奏不匹配&#xff0c;所以决定用动画桢事件来处理技能释放。当释放技能的时候&#xff0c;先播放技能动画&#xff0c;然后再动画桢所在的时间戳执行技能的逻辑。 2&#xff0c;具体实现 1&#xff0c;…