绘图系统五:数据产生

news2024/12/26 23:20:59

文章目录

    • AxisFrame组件
    • 源码模式
    • 序列化
    • 导入数据
    • 获取文件信息
    • 导入文本
    • 导入二进制数据

  • 📈一 三维绘图系统 📈二 多图绘制系统
  • 📈三 坐 标 轴 定 制 📈四 定制绘图风格
  • 源码地址 Python打造动态绘图系统

AxisFrame组件

AxisFrame是存放某一维坐标的组件,目前由一个标签,一个下拉选框和一个输入框构成。下拉选框主要目的是判断输入方式,目前有4个选择,分别是源代码、序列化、外部导入和无数据。

其中源代码就是通过调用eval执行的代码,这个没什么好说的。但序列化目前的实现方式,用的仍旧是类似Pyton的语法,然后在外面套一层壳,这还是得程序员才能懂。而外部导入目前只起到一个说明的作用,即外部数据导入了,然后这个地方一变,换言之,AxisFrame自身并没有导入数据的功能。

所以,这两个功能还是需要优化的,当ComboBox的选中项发生变化时,需要调整一下布局,故而initWidgets函数改成下面的形式,其中initRes则根据传入的数据获取模式来初始化其他控件。

def initWidgets(self, widths):
    tk.Label(self, text=self.label, width=widths[0]).pack(side=tk.LEFT)
    slct = ttk.Combobox(self, width=widths[1], 
        textvariable=self.mode)
    slct['value'] = self.MODES
    slct.bind('<<ComboboxSelected>>', self.slctChanged)
    slct.pack(side=tk.LEFT)
    self.initRes(widths[3])

源码模式

源码模式最简单,只要有一个Entry就可以,从外观上来看,不需要做任何修改,但代码需要写到另一个函数中。

代码如下,其逻辑顺序是,先实现一个srcEntry,然后调用showSrcEntry将其展示出来。

def initRes(self, width):
    self.errWidth = width
    mode = self.mode.get()
    self.srcEntry = tk.Entry(self, width=width, textvariable=self.srcText)
    if mode=="源代码":
        self.showSrcEntry()
    
def showSrcEntry(self):
    self.srcEntry.pack(padx=5, pady=2, side=tk.LEFT, fill=tk.X)

其中self.srcText是一个StringVar,是在initVar中定义的

self.srcText = tk.StringVar()

然后把readPython函数改为

def readPython(self, t=None, x=None, y=None, z=None):
    self.data = eval(self.srcText.get())
    return self.data

序列化

序列化的含义是生成一个等差数列,要有起点,有终点,还得有步长。所以最直接的创建方法,就是三个Label和三个Entry,而且这些部件需要放进一个Frame中。结合已有的源代码输入控件,initRes函数改为下列形式。

def initRes(self, width):
    self.errWidth = width
    self.srcEntry = tk.Entry(self, width=width, textvariable=self.srcText)
    
    self.arrFrame = ttk.Frame(self, width=width-5)
    for i, key in enumerate(["起点", "终点", "步长"]):
        tk.Label(self.arrFrame, text=key).grid(row=0, column=i*3)
        tk.Entry(self.arrFrame, width=int(width/6), 
            textvariable=self.arrText[i]).grid(row=0, column=i*3+1)                

    self.showRes(self.mode.get())

其中self.arrText是一个StringVar列表,定义在initVar中

self.arrText = [tk.StringVar() for _ in range(3)]

self.showRes则是显示某组部件的方法

def showRes(self, mode):
    resDct = {"源代码":self.srcEntry, "序列化":self.arrFrame}
    resDct[mode].pack(padx=5, pady=2, side=tk.LEFT, fill=tk.X)

最后效果如下

在这里插入图片描述

另一方面,需要更改getArray函数

def getArray(self):
    vs = [float(t.get()) for t in self.arrText]
    self.data = np.arange(*vs)
    return self.data

绘图结果如下

在这里插入图片描述

导入数据

由于绘图系统中全局的导入按钮已经有了导入数据的功能,所以AxisFrame的导入数据其实有两套工作逻辑:如果事先已经导入数据了,那么就应该什么也不做;如果并没有导入数据,就应该打开数据并导入。

所以,导入数据选项,至少要有两个部件,一个按钮用于打开文件,外加一个Entry或者Label,用于描述导入的内容。

其更改过程与序列化的更改如出一辙,先在initVar中添加self.imText

self.imText = tk.StringVar()

然后在initRes中添加self.imFrame,

# 导入数据设置
self.imFrame = ttk.Frame(self, width=width-5)
tk.Entry(self.imFrame, width=width-6,
    textvariable=self.imText).pack(side=tk.LEFT)
ttk.Button(self.imFrame, text="📂", width=3,
    command=self.btnImport).pack(side=tk.LEFT, padx=3)

最后修改showRes中的resDct字典

resDct = {"源代码":self.srcEntry, "序列化":self.arrFrame,
          "外部导入": self.imFrame}

以及slctChanged中添加

self.imFrame.pack_forget()

效果如下

在这里插入图片描述

获取文件信息

📂按钮指明了命令函数self.btnImport,其第一步一定是打开文件,打开文件需要用到文件对话框,需要导入

from tkinter.filedialog import askopenfilename

虽然对于不同文件,其后续处理方式并不相同,但是将获取到的文件名传递给输入框却十分合理,

def btnImport(self):
    f = askopenfilename(
        filetypes=[('文本文件', 'txt'), ('文本文件', 'csv'),
            ('二进制文件', 'bin')])
    self.imText.set(f)

其运行结果为

在这里插入图片描述

如果想对得到的文件做进一步的导入,那么可能需要额外的参数,对于文本文件来说,比如首行空格,分隔符等都是需要考虑的;而二进制数据,最起码要对读取数据的数据类型以及行列数做一个判断。

但有的时候可能又没那么多麻烦,为了应付两种需求,那么可以为按钮绑定左键和右键两种模式。按钮初始化代码更改如下

btn = ttk.Button(self.imFrame, text="📂", width=3)
btn.pack(side=tk.LEFT, padx=3)
btn.bind("<Button-1>", self.btnImportSimple)
btn.bind("<Button-3>", self.btnImportComplex)

这里绑定的两个函数分别响应左键单击和右键单击,具体的实现细节,将在后面的博客给出。

导入文本

由于我们设置了两种导入数据的方式,一种简单的,一种复杂的。如果用复杂的,那么就需要设计一个参数对话框,并获取相关参数;如果用简单的,那么只需沿用之前设置的参数就可以了。

这隐含着一个必选的方案,即设计几个类成员,用于存放这些参数。最好的地方当然是放在initVar函数中

def initVar(self, mode):
    self.txtPara = {}
    self.binPara = {}
    self.FILES = [('文本文件', 'txt'), ('文本文件', 'csv'),
                ('二进制文件', 'bin')]
    # ...

由于目前只对文本文件和二进制有兴趣,所以参数列表也只用了两个。

接下来先设计简单的数据导入函数

def btnImportSimple(self, evt):
    f = askopenfilename(filetypes=self.FILES)
    self.data = np.genfromtxt(f, **self.txtPara)
    self.showImData()

def showImData(self):
    tmp = self.data.reshape(-1)[:10].astype(str)
    self.imText.set(", ".join(tmp.tolist()))

其中showImData可以展示前10个数值,效果如下

在这里插入图片描述

复杂文本数据的导入,需要一个参数对话框,我们使用的genfromtxt的常用参数大致有下面这些

genfromtxt(fname,dtype,comments,delimiter,skipd_header,skip_fonter,converters,missing_values,filling_values,usecols,names, autostrip,**kwarg)

其中,大部分参数与loadtxt中含义相同,其他参数的含义如下。

参数类型含义
fname字符串文件名
dtype字符串读取后的数据类型
comments字符串注释标识符,加载时会自动忽略注释标识符后的字符串
delimiter字符串分割符,为整数时表示元素最大宽度
skip_header数值跳过文件头部的字符行数
skip_footer字数值跳过文件尾部字符串行数
missing_values字符串指定数组中忽略的值
filling_values字符串指定某个值用于替代忽略值
autostrip布尔为True时可自动去除变量首尾的空格
converters字典或函数用以转化数据格式
usecols数值使用的列号
encoding字符串编码方式

据此先设计一个翻译字典,以便于文件对话框使用

self.TXTLABEL = {
    "comments" : "注释标识",
    "delimiter" : "分割符号",
    "skip_header" : "文首跳过行数",
    "skip_footer" : "文尾舍弃行数",
    "missing_values" : "指定忽略值",
    "filling_values" : "忽略值替代为",
    "autostrip" : "去除首尾空格",
    "usecols" : " 使用的列号",
    "encoding" : "编码方式",
}

为了实现这些功能的顺利输入,可以设计一个字典参数对话框。然后就可以更改高级文本的导入代码了,考虑到这里面有一些参数是整型,所以要在得到数据之后对数据类型进行转换

def btnImportComplex(self, evt):
    f = askopenfilename(filetypes=self.FILES)
    if f.endswith('.txt'):
        self.txtImport(f)

def txtImport(self, fileName):
    dct = {v:"" for v in self.TXTLABEL.values()}
    AskDct(dct)
    for key in dct:
        if dct[key] == "":
            continue
        if key in ["skip_header", "skip_footer", "usecols"]:
            dct[key] = int(dct[key])
        self.txtPara[key] = dct[key]
    self.data = np.genfromtxt(fileName, **self.txtPara)
    self.showImData()

导入二进制数据

二进制数据和文本数据相比,没有那么多的格式要求,但最起码的数据类型和数组形状还是要声明一下的。

self.BINLABEL = ["数据类型", "行数", "列数", "选择行", "选择列"]

这里面之所以没像self.TXTLABEL那样做一个字典,是因为二进制读取函数np.fromfile只有一个数据类型参数,而行数、列数等其他数据说明参数,都需要我们自定义函数来解决。

def binImport(self, fileName):
    dct = {key:"" for key in self.BINLABEL}
    AskDct(dct)
    binPara = {} if dct["数据类型"]=="" else {"dtype":dct["数据类型"]}
    b = np.fromfile(fileName, **binPara)        
    shape = [-1,-1]
    for i,key in enumerate(["行数", "列数"]):
        if dct[key] != "":
            shape[i] = int(dct[key])
    b = b.reshape(*shape)

    if dct["选择列"] != "":
        b = b[int(dct["选择列"]), :]
    elif dct["选择行"] != "":
        b = b[:, int(dct["选择行"])]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1031148.html

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

相关文章

热电偶的工作原理

当有两种不同的导体或半导体A和B组成一个回路&#xff0c;其两端相互连接时&#xff0c;只要两结点处的温度不同&#xff0c;一端温度为T&#xff0c;称为工作端或热端&#xff0c;另一端温度为T0 &#xff0c;称为自由端&#xff08;也称参考端&#xff09;或冷端&#xff0c;…

使用递归思想遍历二叉树

二叉树的遍历主要有两种方式&#xff1a;深度优先遍历和广度优先遍历 这篇主要讲使用深度优先遍历来遍历二叉树 深度优先遍历有以下三种 前、中、后序遍历&#xff0c;这三种遍历方式的主要区别是中间节点的位置所在的顺序 前序遍历&#xff1a;中间节点在叶子节点前面 中序遍历…

EPLAN_001#常用功能(一)

一、栅格设置、背景颜色设置 二、插入设备图标&#xff08;快捷键 Insert&#xff09; 按TAB旋转方向 三、 通过左CTRLENTER输入 四、移动属性文本、复制格式 CTRLB 可以移动设备图形中的相关文本&#xff08;或者右键—文本—移动属性文本&#xff09; 很对多个文本的&#xf…

ElasticSearch进阶:一文全览各种ES查询在Java中的实现

ElasticSearch进阶&#xff1a;一文全览各种ES查询在Java中的实现 ElasticSearch进阶&#xff1a;一文全览各种ES查询在Java中的实现 es基本语句详解 查询语句详解 前言 ElasticSearch第一篇&#xff1a;ElasticSearch基础&#xff1a;从倒排索引说起&#xff0c;快速认知ES …

Setup exvim enviroment

1. 官方网站 exvim官方网站 sudo apt-get install ctags id-utils cscope silversearcher-ag 2. vundle管理plugins 【NOTE】按照官网安装步骤&#xff0c;会安装一些默认plugins。 查看和修改.vimrc.plugins 打开默认未安装的plugins&#xff0c;比如airline. 打开plugi…

2023华为杯研究生数学建模竞赛E题思路分析+代码+论文

如下为C君撰写的2023华为杯研究生数学建模竞赛E题思路分析&#xff0c;代码论文见文末。 E题思路 出血性脑卒中临床智能诊疗建模 一、 背景介绍 出血性脑卒中指非外伤性脑实质内血管破裂引起的脑出血&#xff0c;占全部脑卒中发病率的10-15%。其病因复杂&#xff0c;通常因脑…

Vue构建SPA项目实现路由

目录 前言 一、Vue CLI简介 1.什么是Vue CLI 2.Vue CLI的特点 二、SPA项目搭建 1.安装Vue CLI 2.使用脚手架vue-cli来构建项目 ​编辑 3.项目结构说明 4.什么是*.vue文件 三、基于SPA完成路由并嵌套路由 1.基于SPA完成路由 1. 1在src下的components 创建自定义组件…

动态代理原理和设计模式详解

一、什么是代理模式代理模式是一种设计模式&#xff0c;提供了对目标对象额外的访问方式&#xff0c;即可以通过代理访问目标对象&#xff0c;这样可以在不修改原目标对象的前提下&#xff0c;提供额外的方式进行访问&#xff0c;扩展目标对象的功能。 通俗的说&#xff0c;例…

html学习综合案例1

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>个人简介</title> </head> <body>…

【从0学习Solidity】9. 常数 constant和immutable

【从0学习Solidity】9. 常数 constant和immutable 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&…

golang入门笔记——pprof性能分析

文章目录 简介runtime/pprof的使用命令行交互网络服务性能分析pprof与性能测试结合压测工具go-wrk 简介 golang性能分析工具pprof的8个指标 1.性能分析的5个方面&#xff1a;CPU、内存、I/O、goroutine&#xff08;协程使用情况和泄漏检查&#xff09;、死锁检测以及数据竟态…

JavaBean文字格斗游戏之进阶版

以上都是关于role类的定义 求赞!

go 内存泄露

事件回顾 9.15号晚18点服务端发版9.16号晚21点监控显示自发版后服务器 TCP_alloc 指标一路飙升至40K(如图) 问题分析 看到 tcp_alloc 指标异常&#xff0c;初步怀疑有tcp连接创建后未关闭&#xff0c;应该是上次发版写了什么代码导致的。回顾此次发版清单&#xff0c;问题应该…

IBM LSF 任务调度系统的主要术语和概念

LSF 术语和概念 了解 IBM LSF 基本术语和概念。 作业状态 IBM Spectrum LSF 作业具有多个状态。 PEND 正在队列中等待调度和分派。 RUN 已分派到主机并正在运行。 DONE 正常完成&#xff0c;退出值为零。 EXIT 已完成&#xff0c;具有非零退出值。 PSUSP 作业处于暂…

FBX文件结构解读【文本格式】

FBX 格式几乎受到所有 3D 引擎的支持&#xff0c;是 Autodesk 开发的 3D 模型的专有格式。它支持顶点、索引、法线、UV坐标、材质和动画。 FBX还支持许多其他类型的信息&#xff0c;但它们对游戏引擎几乎没有用处。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 有两种…

【C++】String类基本接口介绍及模拟实现(多看英文文档)

string目录 如果你很赶时间&#xff0c;那么就直接看我本标题下的内容即可&#xff01;&#xff01; 一、STL简介 1.1什么是STL 1.2STL版本 1.3STL六大组件 1.4STL重要性 1.5如何学习STL 二、什么是string&#xff1f;&#xff1f;&#xff08;本质上是一个类&#xff0…

Leetcode | 303.区域和检索-数组不可变

303.区域和检索-数组不可变 欢迎关注公众号“三戒纪元” 题目 给定一个整数数组 nums&#xff0c;处理以下类型的多个查询: 计算索引 left 和 right &#xff08;包含 left 和 right&#xff09;之间的 nums 元素的 和 &#xff0c;其中 left < right 实现 NumArray 类&a…

24个Docker常见问题处理技巧

1.Docker 迁移存储目录 默认情况系统会将 Docker 容器存放在 var/lib/docker 目录下 [问题起因] 今天通过监控系统&#xff0c;发现公司其中一台服务器的磁盘快慢&#xff0c;随即上去看了下&#xff0c;发现 /var/lib/docker这个目录特别大。 由上述原因&#xff0c;我们都知…

低代码技术推动能源行业数字化转型,服务商模式带来转型新商机

“新能源企业通过数字化转型不仅可以提高企业的运营效率和市场竞争力&#xff0c;还可以创新商业模式、提高能源生产效率和可持续性、优化资源配置并适应市场需求。选择百数的服务商模式&#xff0c;不仅可以解决我们想实现数字化转型的需求&#xff0c;还让我们多了一个开展新…

计算机毕设 python图像检索系统设计与实现

文章目录 0 前言1 课题简介2 图像检索介绍(1) 无监督图像检索(2) 有监督图像检索 3 图像检索步骤4 应用实例5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&am…