简单介绍网站建设的一般流程,漯河哪里做网站,亿企邦网站建设,可以做调查问卷的网站文章目录 导入数据文件对话框修改绘图逻辑源代码 Python绘图系统系列#xff1a;将matplotlib嵌入到tkinter 简单的绘图系统
导入数据
单纯从作图的角度来说#xff0c;更多情况是已经有了一组数据#xff0c;然后需要将其绘制。这组数据可能是txt格式的#xff0c;也可能… 文章目录 导入数据文件对话框修改绘图逻辑源代码 Python绘图系统系列将matplotlib嵌入到tkinter 简单的绘图系统
导入数据
单纯从作图的角度来说更多情况是已经有了一组数据然后需要将其绘制。这组数据可能是txt格式的也可能是csv格式的还可能是二进制数据。当然这些一会儿在想首先就是要添加一个按钮将setCtrlButtons函数添加一行
def setCtrlButtons(self, frm):ttk.Button(frm, text绘图,width5,commandself.btnDrawImg).pack(sidetk.LEFT)ttk.Button(frm, text加载,width5,commandself.btnLoadData).pack(sidetk.LEFT)然后就可以考虑self.btnLoadData函数了。
简洁起见以后将不再具体展示setCtrlButtons的具体代码而只是写出新增的代码。
文件对话框
加载数据其实就是加载文件那么文件对话框就很重要。
tkinter.filedialog中的askopenfilename就是文件对话框预感这个函数可能不止一处出现故而导入一下以方便调用
from tkinter.filedialog import askopenfilename这个函数的好处是只返回读取到的文件名而不像askopenfile一样返回一个文件对象。
而self.btnLoadData函数如果只是想实现一个最简单的功能那么 可以写为
def btnLoadData(self):name askopenfilename()data np.genfromtxt(name)if data.shape[1] 2:returnself.xs data[:,0]self.ys data[:,1]self.drawPlot()效果如下 修改绘图逻辑
现在我们有了两种数据生成模式一是用语法生成二是通过加载得到。但目前来说这两种生成方式并不兼容。为了解决这个问题可以为x和y的输入框添加一个标识比如当x或者y的输入框中是data的时候再点击绘图就可以选中加载后的数据。
由于tkinter中输入Entry内容比较繁琐所以封装一个全局的函数专门用于更改Entry内容
def setEntry(e, text):e.delete(0, end)e.insert(0, text)接下来将加载数据函数和绘图函数分别改写为
def btnLoadData(self):name askopenfilename()data np.genfromtxt(name)if data.shape[1] 2:returnself.xs data[:,0]setEntry(self.xEntry, data)self.ys data[:,1]setEntry(self.yEntry, data)def btnDrawImg(self):xLab self.xEntry.get()if xLab ! data:x eval(fnp.linspace({xLab}))self.xs xelse:x self.xsyLab self.yEntry.get()if yLab ! data:self.ys eval(yLab)self.drawPlot()在btnLoadData函数中取消了绘图功能而是在导入数据后将xEntry和yEntry的内容设置为data。
而绘图函数中检测xEntry和yEntry的内容如果是data那么说明已经读取到了相关数据就直接调用而非重新生成。 源代码
最后把源代码附在下面
import tkinter as tk
import tkinter.ttk as ttk
from tkinter.filedialog import askopenfilenameimport matplotlib as mpl
mpl.use(TkAgg)
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figureimport numpy as npdef setEntry(e, text):e.delete(0, end)e.insert(0, text)class DarwSystem():def __init__(self):self.root tk.Tk()self.root.title(数据展示工具)frmCtrl ttk.Frame(self.root,width320)frmCtrl.pack(sidetk.RIGHT, filltk.Y)self.setFrmCtrl(frmCtrl)frmFig ttk.Frame(self.root)frmFig.pack(sidetk.LEFT,filltk.BOTH,expandtk.YES)self.setFrmFig(frmFig)self.root.mainloop()def setFrmCtrl(self, frmCtrl):frm ttk.Frame(frmCtrl, width320)frm.pack(sidetk.TOP, filltk.X)self.setCtrlButtons(frm)frm ttk.Frame(frmCtrl)frm.pack(sidetk.TOP, filltk.X)self.setFrmX(frm)frm ttk.Frame(frmCtrl)frm.pack(sidetk.TOP, filltk.X)self.setFrmY(frm)def setFrmX(self, frm):tk.Label(frm, textx).pack(sidetk.LEFT)self.xEntry tk.Entry(frm)self.xEntry.pack(sidetk.LEFT, filltk.X)def setFrmY(self, frm):tk.Label(frm, texty).pack(sidetk.LEFT)self.yEntry tk.Entry(frm)self.yEntry.pack(sidetk.LEFT, filltk.X)def setCtrlButtons(self, frm):ttk.Button(frm, text绘图,width5,commandself.btnDrawImg).pack(sidetk.LEFT)ttk.Button(frm, text加载,width5,commandself.btnLoadData).pack(sidetk.LEFT)def btnLoadData(self):name askopenfilename()data np.genfromtxt(name)if data.shape[1] 2:returnself.xs data[:,0]setEntry(self.xEntry, data)self.ys data[:,1]setEntry(self.yEntry, data)def btnDrawImg(self):xLab self.xEntry.get()if xLab ! data:x eval(fnp.linspace({xLab}))self.xs xelse:x self.xsyLab self.yEntry.get()if yLab ! data:self.ys eval(yLab)self.drawPlot()def drawPlot(self):self.fig.clf()ax self.fig.add_subplot()ax.plot(self.xs, self.ys)self.fig.subplots_adjust(left0.1, right0.95, top0.95, bottom0.08)self.canvas.draw()passdef setFrmFig(self, frmFig):self.fig Figure()self.canvas FigureCanvasTkAgg(self.fig,frmFig)self.canvas.get_tk_widget().pack(sidetk.TOP,filltk.BOTH,expandtk.YES)self.toolbar NavigationToolbar2Tk(self.canvas,frmFig,pack_toolbarFalse)self.toolbar.update()self.toolbar.pack(sidetk.RIGHT)if __name__ __main__:test DarwSystem()