基于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构建一个自己的聊天室,有助于帮助小伙伴们理解掌握Python的socket编程,需要的朋友可以参考下
    2023-04-04
  • Python装饰器用法实例分析

    Python装饰器用法实例分析

    这篇文章主要介绍了Python装饰器用法,结合实例形式分析了带参数装饰器、无参数装饰器等相关实现与使用技巧,需要的朋友可以参考下
    2019-01-01
  • 7个有用的Pandas显示选项分享

    7个有用的Pandas显示选项分享

    Pandas是一个在数据科学中常用的功能强大的Python库。在某些情况下,我们可能希望更改所显示内容的格式,这就需要使用Pandas的一些定制功能来帮助我们自定义内容的显示方式。本文为大家总结了7个有用的Pandas显示选项,希望对大家有所帮助
    2022-12-12
  • python如何解决指定代码段超时程序卡死

    python如何解决指定代码段超时程序卡死

    这篇文章主要介绍了python如何解决指定代码段超时程序卡死,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 读取nii或nii.gz文件中的信息即输出图像操作

    读取nii或nii.gz文件中的信息即输出图像操作

    这篇文章主要介绍了读取nii或nii.gz文件中的信息即输出图像操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Python基于docker部署的Mysql备份查询脚本

    Python基于docker部署的Mysql备份查询脚本

    这篇文章主要来和大家分享Python基于docker部署的Mysql备份查询的脚本,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起了解下
    2024-04-04
  • Python下载网易云歌单歌曲的示例代码

    Python下载网易云歌单歌曲的示例代码

    这篇文章主要介绍了Python下载网易云歌单歌曲的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • python自定义解析简单xml格式文件的方法

    python自定义解析简单xml格式文件的方法

    这篇文章主要介绍了python自定义解析简单xml格式文件的方法,涉及Python解析XML文件的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-05-05
  • Python实现批量压缩文件/文件夹zipfile的使用

    Python实现批量压缩文件/文件夹zipfile的使用

    本文主要介绍了Python实现批量压缩文件/文件夹zipfile的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Python实现多线程的两种方式分析

    Python实现多线程的两种方式分析

    这篇文章主要介绍了Python实现多线程的两种方式,结合实例形式分析了通过自定义函数传递Thread对象以及继承Thread类两种多线程实现方式相关操作技巧,需要的朋友可以参考下
    2018-08-08

最新评论