Python实现四维图像绘制系统

news/2024/7/24 2:47:01

文章目录

    • 动图绘制系统的实现
    • 播放控制
    • 接口优化
    • 总结

Python绘图系统:

  • 📈从0开始的3D绘图系统📉一套3D坐标,多个函数📊散点图、极坐标和子图
  • 自定义控件:绘图风格📉风格控件📊定制绘图风格
  • 坐标设置进阶:动态更新组件📌导入外部文件📌导入txt
  • 动图绘制:动图绘制

动图绘制系统的实现

所谓动图绘制,其实只需要一个循环,并且每次绘图之前,要有一定的延时。启用多线程和延时,需要导入下面两个模块

from threading import Thread
import time

接下来,就是self.btnAniStart函数和具体的动图绘制函数了

def btnAniStart(self): Thread(target=self.btnDrawCycle, daemon=True).start()def btnDrawCycle(self):dt = self.aniDelay.get()/1000.0for i in range(self.aniFrameNum.get()):self.tIndex = iself.btnDrawImg()time.sleep(dt)

点击播放按钮后效果如下

在这里插入图片描述

播放控制

从图像播放的角度来说,这个设计并不十分合理,因为点击播放的三角号之后,应该要给出一个停止播放的按钮,相应地DrawCycle函数也应该新增一个无尽循环模式。

为了实现播放控制,为播放按钮绑定一个可变字符串

self.btnStartText = tk.StringVar()
self.btnStartText.set("▶")
ttk.Button(frm, width=3, textvariable=self.btnStartText,command=self.btnAniStart).pack(**pDct)

然后修改btnAniStart,大致改成下面的形式,但这里只是添加了暂停的逻辑,但并没有真正实现暂停的功能

def btnAniStart(self):if self.btnStartText.get() == "▶":Thread(target=self.drawCycle, daemon=True).start()self.btnStartText.set("⏸")else:self.btnStartText.set("▶")

而真正实现暂停功能,就需要修改drawCycle函数了

def drawCycle(self):dt = self.aniDelay.get()/1000.0num = self.aniFrameNum.get()while self.btnStartText.get() == "⏸":self.tIndex = (self.tIndex + 1) % numself.btnDrawImg()time.sleep(dt)

在这里插入图片描述

至此,就完成了一个动态图像绘制系统。

接口优化

开发过程中会经常遇到新增的需求,这些需求的实现,会对原来的设计形成干扰,而且这些需求累加在一起,会导致代码变得十分畸形。比如一开始DrawType类只包含绘图类型和维度,所以在AxisList中做对象的时候,变量名取为drawTypeDim。但后来DrawType又加入了其他功能,使得drawTypeDim这个变量变得很蠢,所以接下来要重新命名。

主要变更如下

  • AxisList类

    • drawTypeDim 变为 drawType
  • DrawSystem类

    • drawTypeDim 变为 drawType
  • AxisList类中定义的函数,但DrawSystem中有调用

    • getDrawType -> getType
    • getDrawDim -> getDim

另外,由于t轴和xyz在绘图时的作用相去甚远,所以将getDim函数拆分成xyz和t两个函数。在AxisList中新增两个函数

def getXYZ(self):return self.getDim().replace("t", "")def hasTimeAxis(self):return "t" in self.getDim()

更改DrawSystem中的调用,btnDrawImgal.getDim().replace('t',"")改为al.getXYZ()readDatas改写如下

def readDatas(self, al):dct = {}data = {}if al.hasTimeAxis():data['t'] = al.setData('t')dct['t'] = data['t'][self.tIndex]for flag in al.getXYZ():data[flag] = al.setData(flag, **dct)dct[flag] = data[flag]return data

总结

本文正好是Python绘图系统的第20篇博客。目前,这个绘图系统可以绘制二维Plot,三维Plot,极坐标Plot,而且支持子图的绘制。而今又添加了动态图形的绘制功能。

尽管从目前来说,这段程序称不上是一个完备的软件,因为这里没有基本的报错系统,也没有日志管理系统,但作为一个快速入门的基础项目来说,却是非常适宜的。同时,这个系统已经具备了初步的骨架,基于这套代码,可以进一步实现更加复杂的绘图功能,换言之,从极客的角度来说,这个绘图系统已经具备了“可玩性”。

这个项目虽然体量很小,目前只有不到500行代码,但对于一个0到5年码零的Pythoner来说,看了必会有所得。


https://dhexx.cn/news/show-5071402.html

相关文章

Apache Spark 的基本概念

Apache Spark 是一种快速、可扩展、通用的数据处理引擎。它是一种基于内存的计算框架,支持分布式数据处理、机器学习、图形计算等多种计算任务。与传统的 Hadoop MapReduce 相比,Spark 具有更高的性能和更广泛的应用场景。 Spark 中的基本概念包括&…

2817. 限制条件下元素之间的最小绝对差;2305. 公平分发饼干;878. 第 N 个神奇数字

2817. 限制条件下元素之间的最小绝对差 核心思想:枚举二分。我们去枚举nums[j],然后用一个数据结构去装nums[i],利用二分去找在这个数据结构中离nums[j]最近的值的下标,然后统计最小值。这个数据结构可以使用SortedList&#xff…

pg-备份和还原

1. 逻辑备份 PostgreSQL中提供了pg_dump、pg_dumpall命令进行数据库的逻辑备份。pg_dump与pg_dumpall命令的功能差不多,只是pg_dumpall是将一个PostgreSQL数据库集群全部转储到一个脚本文件中,而pg_dump命令可以选择一个数据库或部分表进行备份。使用pg_…

Linux命令(80)之sort

linux命令之sort 1.sort介绍 linux命令sort用于将文本文件内容以行为单位加以排序;sort命令默认按每行的第一个字符排序,根据首字母的ASCII码值进行升序(从小到大排列)。 sort的默认分隔符是空白(空格和tab),多少空白都算一个分隔符。 2.…

【Vue.js】生命周期之基本使用

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》 《springMvc使用》 ⛺️ 生活的理想,为了不断更新自己 ! 目录 ​编辑 1.Vue是什么 2.Vue的特点及优势 3. 使用Vue的详细步骤 3.1.导入 3.2…

【Qt】QGroundControl入门4:框架QGCApplication

1、简述 QGroundControl的框架在QGCApplication中实现,QGCApplication继承自QApplication; QGCApplication构造函数中创建QGCToolbox实例,QGCToolbox用来管理各种服务和工具; QGCApplication::_initCommon():将C++类注册到QML对象中; QGCApplication::_initForNormalApp…

网络安全(黑客)自学​

前言 作为一个合格的网络安全工程师,应该做到攻守兼备,毕竟知己知彼,才能百战百胜。 计算机各领域的知识水平决定你渗透水平的上限。 【1】比如:你编程水平高,那你在代码审计的时候就会比别人强,写出的漏洞…

无涯教程-JavaScript - CEILING.MATH函数

描述 CEILING.MATH函数将数字四舍五入到最接近的整数或最接近的有效倍数。 Excel CEILING.MATH函数是Excel中的十五个舍入函数之一。 语法 CEILING.MATH (number, [significance], [mode])争论 Argument描述Required/OptionalNumberNumber must be less than 9.99E307 and …

王道数据结构C语言循环链表基本操作实现

文章目录 一、循环单链表1.1初始化及判空操作1.2判断是否是尾结点 二、循环双链表2.1初始化2.2判空2.3判断尾结点2.4循环双链表的删除 一、循环单链表 1.1初始化及判空操作 其实循环链表就是在单链表(双链表)上做一点小小的优化 它是把尾结点的next指…

【面试刷题】——堆栈窗口

“堆栈窗口”(Stack Window)通常不是一个特定的编程术语,但可以用来描述在编程和计算机科学领域中一些相关的概念。这些概念涉及到堆栈(stack)和窗口(window)等术语的组合。以下是一些可能涉及到…