基于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跨平台识别周围WiFi的代码实现与技巧分享

    Python跨平台识别周围WiFi的代码实现与技巧分享

    在物联网设备管理、网络安全审计或智能家居场景中,识别周围WiFi网络是基础需求,Python凭借其丰富的生态库,能够跨平台实现WiFi扫描、信号强度检测及网络分析,本文将系统梳理主流方法,帮助开发者快速构建可靠的WiFi识别工具,需要的朋友可以参考下
    2026-01-01
  • python使用pynput捕获单个按键的步骤详解(包括组合键和功能键)

    python使用pynput捕获单个按键的步骤详解(包括组合键和功能键)

    在数字时代,键盘是与计算机交流的主要工具,键盘的每一次敲击都承载着信息,而在某些场景下,可能需要记录这些信息,这时候,pynput库就派上了大用场,它可以轻松地帮捕获并记录键盘上的每一个操作,所以本文给大家介绍了python使用pynput捕获键的操作步骤
    2024-05-05
  • 利用python实现xml与数据库读取转换的方法

    利用python实现xml与数据库读取转换的方法

    这篇文章主要给大家介绍了关于利用python实现xml与数据库读取转换的方法,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • Python使用python-pptx实现设置PPT页面与文档属性

    Python使用python-pptx实现设置PPT页面与文档属性

    这篇文章主要为大家详细介绍了Python如何使用python-pptx实现设置PPT页面与文档属性,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2026-04-04
  •  Java SE 面向对象编程的3个常用接口

     Java SE 面向对象编程的3个常用接口

    这篇文章主要f Java SE 面向对象编程的3个常用接口,Comparable、Comparator 比较器、Cloneable,下面文章详细介绍,需要的小伙伴可以参考一下
    2022-01-01
  • python执行shell脚本的四种方法

    python执行shell脚本的四种方法

    在Python中提供了很多的方法可以调用并执行shell脚本,本文主要介绍了python执行shell脚本的四种方法,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Python处理JSON时的值报错及编码报错的两则解决实录

    Python处理JSON时的值报错及编码报错的两则解决实录

    这篇文章主要介绍了Python处理JSON时的值报错及编码报错的两则解决实录,在这里还是想建议一下使用Python 3.x版本,Python 3默认的Unicode编码能在实际使用中为我们省去不少问题,需要的朋友可以参考下
    2016-06-06
  • 利用python在Word文档中创建和执行条件邮件合并

    利用python在Word文档中创建和执行条件邮件合并

    邮件合并域和IF域是Word文档中两种非常实用的域,前者可以用来进行邮件合并,根据数据批量创建定制的Word文档,本文讲介绍如何使用Python在Word文档中创建条件邮件合并域以及执行条件邮件合并,需要的朋友可以参考下
    2024-08-08
  • python之pkl文件的用法及说明

    python之pkl文件的用法及说明

    这篇文章主要介绍了python之pkl文件的用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • conda与jupyter notebook kernel核环境不一致的问题解决

    conda与jupyter notebook kernel核环境不一致的问题解决

    本文记录在使用conda时候出现的问题,jupter notebook中的环境不一致导致的,具有一定的参考价值,感兴趣的可以了解一下
    2023-05-05

最新评论