绘制太极图 - 使用 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.rhkb.cn/news/247325.html

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

相关文章

Modelarts零代码体验,一键实现工地钢筋盘点,建筑提效新思维

前言 最近家附近的好几块地,同时在进行房产开发建设,早晚都能看到建筑师傅们在忙碌。 某天,夜跑中,发现前方的建筑工地,师傅们忙活的热火朝天,塔吊也在吊运钢筋中。 准备绕路的时候,旁边负责…

解锁创意无限:Adobe Photoshop 2023(PS2023)引领设计革命

Adobe Photoshop 2023 (PS2023),作为图像处理软件的翘楚,以其卓越的性能和无限的可能性,继续引领着数字创意设计的潮流。对于设计师、摄影师、艺术家以及那些对视觉效果有高要求的人们来说,PS2023无疑是他们的必备工具。 在PS202…

web前端项目-实现录音功能【附源码】

录音功能 运行效果&#xff1a;本项目可实现录音软件的录音、存储、播放等功能 HTML源码&#xff1a; &#xff08;1&#xff09;index.html&#xff1a; <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/h…

算法基础课-数据结构

单链表 题目链接&#xff1a;826. 单链表 - AcWing题库 思路&#xff1a;AcWing 826. 单链表---图解 - AcWing 需要注意的点在于理解ne[idx] head&#xff0c;idx表示当前的点&#xff0c;意思是将当前的点链到头结点的后面&#xff0c;再将头结点链在当前idx的前面。 #inc…

Qt|大小端数据转换

后面打算写Qt关于网络编程的博客&#xff0c;网络编程就绕不开字节流数据传输&#xff0c;字节流数据的传输一般是根据协议来定义对应的报文该如何组包&#xff0c;那这就必然牵扯到了大端字节序和小端字节序的问题了。不清楚的大小端的可以看一下相关资料&#xff1a;大小端模…

看图说话:Git图谱解读

很多新加入公司的同学在使用Git各类客户端管理代码的过程中对于Git图谱解读不太理解&#xff0c;我们常用的Git客户端是SourceTree&#xff0c;配合P4Merge进行冲突解决基本可以满足日常工作大部分需要。不同的Git客户端工具对图谱展示会有些许差异&#xff0c;以下是SourceTre…

[C#]winform部署yolov7+CRNN实现车牌颜色识别车牌号检测识别

【官方框架地址】 https://github.com/WongKinYiu/yolov7.git 【框架介绍】 Yolov7是一种目标检测算法&#xff0c;全称You Only Look Once version 7。它是继Yolov3和Yolov4之后的又一重要成果&#xff0c;是目标检测领域的一个重要里程碑。 Yolov7在算法结构上继承了其前…

【AcWing第140场周赛】AcWing 5461. 判断序列(A题)

文章目录 一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、时间复杂度3、代码详解 一、题目 1、原题链接 5461. 判断序列 2、题目描述 二、解题报告 1、思路分析 按照题目要求模拟即可。具体过程&#xff1a;设置一个变量来记录是否满足题目要求&#xff0c;检查…

虹科分享丨汽车技术的未来:Netropy如何测试和确保汽车以太网的性能

来源&#xff1a;艾特保IT 虹科分享丨汽车技术的未来&#xff1a;Netropy如何测试和确保汽车以太网的性能 原文链接&#xff1a;https://mp.weixin.qq.com/s/G8wihrzqpJJOx5i0o63fkA 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #汽车以太网 #车载网络 #Netropy …

SpringBoot常见错误

SpringBoot常见错误 1、SpringBoot启动时报错 错误: 找不到或无法加载主类 com.xxx.xxx.Application springboot启动时报错错误&#xff1a;找不到或无法加载主类 com.xxx.xxx.Application。 解决方法就是打开idea的控制台&#xff0c;输入以下三行命令&#xff1a; mvn cl…

Android发展历程及安装

目录 发展历程 下载网址 安装过程 发展历程 安卓基于Linux内核&#xff0c;Linux内核相当于房屋的地基 开源不等于免费&#xff0c;不能商用 安卓一般每半年小更新&#xff0c;一年大更新 对应API相当于别名 现在安卓安全性越来越高&#xff0c;性能越来越快&#xff0c…

2024.1.25 C++QT 作业

思维导图 练习题 1. 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void sh…

社交巨头之争:Facebook如何保持领先地位

社交媒体领域一直是激烈的竞争场地&#xff0c;而在这场竞争中&#xff0c;Facebook一直屹立不倒&#xff0c;保持着领先地位。究竟是什么让这个社交巨头在激烈的竞争中屡屡脱颖而出呢&#xff1f;本文将深入剖析&#xff0c;揭示Facebook如何通过创新、数据驱动、社会责任等关…

flink-java使用介绍,flink,java,DataStream API,DataSet API,ETL,设置 jobname

1、环境准备 文档&#xff1a;https://nightlies.apache.org/flink/flink-docs-release-1.17/zh/ 仓库&#xff1a;https://github.com/apache/flink 下载&#xff1a;https://flink.apache.org/zh/downloads/ 下载指定版本&#xff1a;https://archive.apache.org/dist/flink…

Java项目:基于SSM框架实现的企业员工岗前培训管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm821基于ssm框架实现的企业员工岗前培训管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格…

深入解析HTTPS:安全机制全方位剖析

随着互联网的深入发展&#xff0c;网络传输中的数据安全性受到了前所未有的关注。HTTPS&#xff0c;作为HTTP的安全版本&#xff0c;为数据在客户端和服务器之间的传输提供了加密和身份验证&#xff0c;从而确保了数据的机密性、完整性和身份真实性。本文将详细探讨HTTPS背后的…

2023年深圳市节假日人口迁入数据,shp/excel格式,需要自取!

基本信息. 数据名称: 深圳市节假日人口迁入数据 数据格式: Shp、excel 数据时间: 2023年国庆节 数据几何类型: 线 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1a0928迁入人口占迁入深圳市人口的比值&#xff0…

(2)(2.9) Holybro Microhard P900无线电遥测设备

文章目录 前言 1 特点 2 规格 3 包装内包括 前言 Holybro Microhard Radio 集成了 microhard Pico 系列射频模块&#xff0c;能够在强大的拓扑结构中提供高性能无线串行通信&#xff0c;如点对点、点对多点和安全 Mesh&#xff08;P840 不提供 Mesh&#xff09;。 它采用跳…

Unity——八叉树的原理与实现

八叉树原理 八叉树&#xff08;Octree&#xff09;是一种用于在三维空间中进行空间分割的数据结构。它将三维空间递归地划分为八个子空间&#xff0c;每个子空间对应于一个八叉树节点。这种分割方式可以有效地组织和管理场景中的对象&#xff0c;提高检索效率&#xff0c;特别…

python笔记10

1、继承 继承是面向对象编程中的一个重要概念&#xff0c;它允许一个类&#xff08;子类&#xff09;继承另一个类&#xff08;父类&#xff09;的属性和方法。通过继承&#xff0c;子类可以重用父类的代码&#xff0c;并且有机会添加新的属性和方法&#xff0c;或者重写父类的…