Python編寫繪圖系統(tǒng)之從文本文件導入數據并繪圖
Python繪圖系統(tǒng)系列:將matplotlib嵌入到tkinter 簡單的繪圖系統(tǒng)
導入數據
單純從作圖的角度來說,更多情況是已經有了一組數據,然后需要將其繪制。這組數據可能是txt格式的,也可能是csv格式的,還可能是二進制數據。當然,這些一會兒在想,首先就是要添加一個按鈕,將 setCtrlButtons
函數添加一行:
def setCtrlButtons(self, frm): ttk.Button(frm, text="繪圖",width=5, command=self.btnDrawImg).pack(side=tk.LEFT) ttk.Button(frm, text="加載",width=5, command=self.btnLoadData).pack(side=tk.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: return self.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: return self.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(f"np.linspace({xLab})") self.xs = x else: x = self.xs yLab = 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 askopenfilename import matplotlib as mpl mpl.use('TkAgg') import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import ( FigureCanvasTkAgg, NavigationToolbar2Tk) from matplotlib.figure import Figure import numpy as np def 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,width=320) frmCtrl.pack(side=tk.RIGHT, fill=tk.Y) self.setFrmCtrl(frmCtrl) frmFig = ttk.Frame(self.root) frmFig.pack(side=tk.LEFT,fill=tk.BOTH,expand=tk.YES) self.setFrmFig(frmFig) self.root.mainloop() def setFrmCtrl(self, frmCtrl): frm = ttk.Frame(frmCtrl, width=320) frm.pack(side=tk.TOP, fill=tk.X) self.setCtrlButtons(frm) frm = ttk.Frame(frmCtrl) frm.pack(side=tk.TOP, fill=tk.X) self.setFrmX(frm) frm = ttk.Frame(frmCtrl) frm.pack(side=tk.TOP, fill=tk.X) self.setFrmY(frm) def setFrmX(self, frm): tk.Label(frm, text="x").pack(side=tk.LEFT) self.xEntry = tk.Entry(frm) self.xEntry.pack(side=tk.LEFT, fill=tk.X) def setFrmY(self, frm): tk.Label(frm, text="y").pack(side=tk.LEFT) self.yEntry = tk.Entry(frm) self.yEntry.pack(side=tk.LEFT, fill=tk.X) def setCtrlButtons(self, frm): ttk.Button(frm, text="繪圖",width=5, command=self.btnDrawImg).pack(side=tk.LEFT) ttk.Button(frm, text="加載",width=5, command=self.btnLoadData).pack(side=tk.LEFT) def btnLoadData(self): name = askopenfilename() data = np.genfromtxt(name) if data.shape[1] < 2: return self.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(f"np.linspace({xLab})") self.xs = x else: x = self.xs yLab = 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(left=0.1, right=0.95, top=0.95, bottom=0.08) self.canvas.draw() pass def setFrmFig(self, frmFig): self.fig = Figure() self.canvas = FigureCanvasTkAgg(self.fig,frmFig) self.canvas.get_tk_widget().pack( side=tk.TOP,fill=tk.BOTH,expand=tk.YES) self.toolbar = NavigationToolbar2Tk(self.canvas,frmFig, pack_toolbar=False) self.toolbar.update() self.toolbar.pack(side=tk.RIGHT) if __name__ == "__main__": test = DarwSystem()
到此這篇關于Python編寫繪圖系統(tǒng)之從文本文件導入數據并繪圖的文章就介紹到這了,更多相關Python繪圖系統(tǒng)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python程序中使用SQLAlchemy時出現亂碼的解決方案
這篇文章主要介紹了Python程序中使用SQLAlchemy時出現亂碼的解決方案,SQLAlchemy是Python常用的操作MySQL數據庫的工具,需要的朋友可以參考下2015-04-04基于pdf2docx模塊Python實現批量將PDF轉Word文檔的完整代碼教程
這篇文章主要介紹了基于pdf2docx模塊Python實現批量將PDF轉Word文檔的完整代碼教程,PDF文件是一種常見的文檔格式,如何轉換成word呢,需要的朋友可以參考下2023-04-04