绘制太极图 - 使用 PyQt

news2025/1/18 3:30:04

大家好!今天我们将一起来探讨一下如何使用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 Qt


class 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 Qt


class RotatedWidget(QGraphicsView):
    def __init__(self, content_widget, angle, parent=None):
        super().__init__(parent)
        self.angle = angle
        scene = QGraphicsScene(self)
        self.setScene(scene)

        # 创建 QGraphicsProxyWidget
        self.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 -= 1
        self.rotate(self.angle)
        self.update()

    def rotate(self, angle):
        self.proxy_widget.setRotation(angle)


class TaiChiWidget2(QWidget):
    def __init__(self):
        super().__init__()
        self.radius = 100
        self.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.coloradmin.cn/o/1416561.html

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

相关文章

Python爬虫---Scrapy框架---CrawlSpider

CrawlSpider 1. CrawlSpider继承自scrapy.Spider 2. CrawlSpider可以定义规则,再解析html内容的时候,可以根据链接规则提取出指定的链接,然后再向这些链接发送请求,所以,如果有需要跟进链接的需求,意思就是…

hardware simulation——编译框架优化

目录 介绍 修改前的最新代码和框架 学习和修改 最终版本 介绍 -------------------------------------------------------------------------------------------------------------------------- https://www.cnblogs.com/wittxie/p/9836097.html 上次那个虽然能完成基本…

计算方法实验2:利用二分法及不动点迭代求解非线性方程

一、问题描述 利用二分法及不动点迭代求解非线性方程。 二、实验目的 掌握二分法及不动点迭代的算法原理;能分析两种方法的收敛性;能熟练编写代码实现利用二分法及不动点迭代来求解非线性方程。 三、实验内容及要求 二分法 (1) 编写代码计算下列数字…

STM正点mini-新建工程模板,GPIO及寄存器(介绍)

一.新建工程模板(基于固件库) 1.1库函数与寄存器的区别 这里的启动文件都是根据容量来进行区分的 对MDK而言即使include了,也不知道在哪里找头文件 STM32F10X_HD,USE_STDPERIPH_DRIVER 二.新建工程模板(基于寄存器) 上面的大部分配置与固件库的一样 具体可以看手…

linux03 用户权限

01.三种权限 02.UGO(root账号) 查看权限 不在root文件中写,是因为其他用户不能进来 举个例子 ll是ls -l 第一部分:权限(11个字节) 第一个:d/- d表示文件夹 - 表示一般文件 二到四&#xff1a…

基于springboot+vue的明星周边产品销售网站(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

初识人工智能,一文读懂机器学习之逻辑回归知识文集(6)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

Java 的文件类的学习总结

目录 一、File 的创建 二、File 类的常用方法 一、File 的创建 二、File 类的常用方法

openssl3.2 - 测试程序的学习

文章目录 openssl3.2 - 测试程序的学习概述笔记openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板openssl3.2 - 测试程序的学习 - test\aborttest.copenssl3.2 - 测试程序的学习 - test\sanitytest.copenssl3.2 - 测试程序的学习 - test\acvp_test.copenssl3.2 - 测…

C++进阶(六)map和set

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、序列式容器与关联式容器二、键值对三、树形结构的关联式容器1、set1、set的介绍2、set的使…

高考复习技巧考研资料、美赛论文及代码,数据收集网站(初高中招生考试全科试卷等)

图,就要从“点、线、面的位置关系”这一内核开始发散,第一层级为彼此的位置关系,平行、相交、异面(两直线间位置)、垂直(相交或异面中的特殊位置),多面体、旋转体等,然后…

2024-macOS系统或Kail系统重——破解ZIP压缩的文件密码

2024-macOS系统或Kail系统重——破解ZIP压缩的文件密码 1. 你们有遇见这样子的情况么: 别人给你发的zip或者下载的zip文件,没有密码打不开么网上都是win系统的,都是没有macOS系统的,所以比较烦恼 2. 所以我就想到了代码&#x…

GoogLeNet模型详解

模型介绍 GoogLeNet是谷歌工程师设计的深度神经网络结构,于2014年在ImageNet比赛中取得了冠军。它的设计特点在于既有深度,又在横向上拥有“宽度”,并采用了一种名为Inception的核心子网络结构。这个网络名字中的“GoogLeNet”是对LeNet的致…

AtCoder Beginner Contest 338D - Island Tour【枚举】

原题链接:https://atcoder.jp/contests/abc338/tasks/abc338_d Time Limit: 2 sec / Memory Limit: 1024 MB Score: 425 points 问题陈述 AtCoder 群岛由 N 座岛屿组成,这些岛屿由 N 座桥梁连接。这些岛屿的编号从1到N,i(1≤i≤N−1)桥双…

Stable Diffusion系列(四):提示词规则与使用

文章目录 基础规则高级规则插件使用 基础规则 所谓提示词,也就是文生图中的文,由连贯的英语单词或句子组成。其最基础的规则是: 不同提示词之间需要用英文逗号分隔,空格和换行不影响读取想混合多个要素时使用|,相当于…

AD/DA(模数数模转换)

文章目录 前言一、介绍部分介绍AD/DA硬件电路模型硬件电路ADC模块DAC模块ADC0809DAC0832 运算放大器(运放)运放电路 DA原理两种不同的DA转换器 AD原理部分AD/DA性能指标XPT2046介绍主要功能XPT2046时序结构控制字节解释单端模式配置表 二、实例使用AD读取…

shell常用命令,参数传递,函数,挂载磁盘

一、shell常用命令 1、ls 功能:显示文件和目录的信息ls 以默认方式显示当前目录文件列表 ls -a 显示所有文件包括隐藏文件 ls -l 显示文件属性,包括大小,日期,符号连接,是否可读写及是否可执行 ls -lh 显示文件的大小,以容易理解的格式印出文件大小 (例如 1K 234M2…

echarts多个折线图共用X轴,实现tooltip合并和分离

echarts共享X轴案例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</…

数据结构(栈stack)

文章目录 一、栈1、栈的定义2、顺序栈2.1、初始化2.2、进栈2.3、出栈2.4、读取 3、链栈 一、栈 1、栈的定义 逻辑结构&#xff1a;与普通线性表相同数据的运算&#xff1a;插入、删除操作有区别 2、顺序栈 2.1、初始化 ”.”适用于结构体变量&#xff0c;”->”适用于…

【算法专题】二分查找(入门)

&#x1f4d1;前言 本文主要是二分查找&#xff08;入门&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…