基于Python实现四维图像绘制系统

 更新时间:2023年09月17日 10:55:37   作者:微小冷  
这篇文章主要为大家详细介绍了如何基于Python语言实现一个简单的四维图像绘制系统,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

动图绘制系统的实现

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

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.0
    for i in range(self.aniFrameNum.get()):
        self.tIndex = i
        self.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.0
    num = self.aniFrameNum.get()
    while self.btnStartText.get() == "⏸":
        self.tIndex = (self.tIndex + 1) % num
        self.btnDrawImg()
        time.sleep(dt)

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

接口优化

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

主要变更如下

1.AxisList类

drawTypeDim 变为 drawType

2.DrawSystem类

drawTypeDim 变为 drawType

3.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中的调用, btnDrawImg al.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

总结

目前,这个绘图系统可以绘制二维Plot,三维Plot,极坐标Plot,而且支持子图的绘制。而今又添加了动态图形的绘制功能。

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

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

到此这篇关于基于Python实现四维图像绘制系统的文章就介绍到这了,更多相关Python四维图像内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python冒泡排序算法的实现代码

    python冒泡排序算法的实现代码

    这篇文章主要介绍了python冒泡排序算法的实现代码,大家参考使用
    2013-11-11
  • Python学习笔记之常用函数及说明

    Python学习笔记之常用函数及说明

    俗话说“好记性不如烂笔头”,老祖宗们几千年总结出来的东西还是有些道理的,所以,常用的东西也要记下来,不记不知道,一记吓一跳,乖乖,函数咋这么多捏
    2014-05-05
  • Python提取转移文件夹内所有.jpg文件并查看每一帧的方法

    Python提取转移文件夹内所有.jpg文件并查看每一帧的方法

    今天小编就为大家分享一篇Python提取转移文件夹内所有.jpg文件并查看每一帧的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Django-migrate报错问题解决方案

    Django-migrate报错问题解决方案

    这篇文章主要介绍了Django-migrate报错问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 使用python编写简单计算器

    使用python编写简单计算器

    这篇文章主要为大家详细介绍了使用python编写一个简单的计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • python中利用Future对象异步返回结果示例代码

    python中利用Future对象异步返回结果示例代码

    future是一种对象,表示异步执行的操作。下面这篇文章主要给大家介绍了关于python中利用Future对象异步返回结果的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • Python编程基础之输入与输出

    Python编程基础之输入与输出

    这篇文章主要为大家介绍了Python输入与输出,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • 使用Python编写提取日志中的中文的脚本的方法

    使用Python编写提取日志中的中文的脚本的方法

    这篇文章主要介绍了使用Python编写提取日志中的中文的脚本的方法,该脚本包括过滤重复的字符行等功能,需要的朋友可以参考下
    2015-04-04
  • 对python捕获ctrl+c手工中断程序的两种方法详解

    对python捕获ctrl+c手工中断程序的两种方法详解

    今天小编就为大家分享一篇对python捕获ctrl+c手工中断程序的两种方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • 详解Pytorch+PyG实现GAT过程示例

    详解Pytorch+PyG实现GAT过程示例

    这篇文章主要为大家介绍了Pytorch+PyG实现GAT过程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04

最新评论