基于matplotlib+tkinter實現(xiàn)簡單的繪圖系統(tǒng)
繪圖系統(tǒng)系列:python將matplotlib嵌入到tkinter中的步驟詳解
封裝成類
在理解matplotlib嵌入到tkinter中的原理之后,就已經(jīng)具備了打造繪圖系統(tǒng)的技術(shù)基礎(chǔ),接下來要做的,就是做一個較有可讀性的繪圖類,其實就是把前面的代碼封裝到class里而已,代碼如下
import tkinter as tk import tkinter.ttk as ttk 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 class DarwSystem(): def __init__(self): self.root = tk.Tk() self.root.title("數(shù)據(jù)展示工具") frmCtrl = ttk.Frame(self.root,width=320) frmCtrl.pack(side=tk.RIGHT) 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): 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)
其中,setFrmCtrl用于設(shè)置控制面板,暫且pass掉,但后續(xù)會實現(xiàn)諸多功能;setFrmFig用于設(shè)置繪圖界面,其中self.fig就是繪圖窗口,后續(xù)若要畫圖,都要在這里設(shè)置坐標(biāo)軸。
布局
最簡單的繪圖系統(tǒng),也至少需要三個部件,分別用于輸入x值、y值以及點擊繪圖按鈕,從而setFrmCtrl函數(shù)可以先寫為下面的形式
def setFrmCtrl(self, frmCtrl): frm = ttk.Frame(frmCtrl) 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)
這里面總計用了3個frm,分別用于存放控制按鈕,設(shè)置x數(shù)據(jù)和y數(shù)據(jù)的模塊,這三個模塊的布局又分別設(shè)計了三個函數(shù),即setFrmX, setFrmY以及setCtrlButtons:
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): tk.Button(frm, text="繪圖",width=5, command=self.btnDrawImg).pack(side=tk.LEFT) # 繪圖函數(shù) def btnDrawImg(self): pass
其中btnDrawImg是繪圖函數(shù),尚未實現(xiàn),所以被pass掉了,此時的布局結(jié)果如下,非常簡單
實現(xiàn)繪圖功能
接下來就是最核心的功能,實現(xiàn)繪圖,主要包括兩個步驟,一是讀取x和y的值,二是用二者的值完成圖像的繪制。
簡單起見,這里用eval函數(shù)直接讀取python表達(dá)式,同時為了讓不熟悉Python的人也可以順利生成x序列,將np.linspace隱去。則xEntry和yEntry的讀取過程可寫為
def btnDrawImg(self): x = eval(f"np.linspace({self.xEntry.get()})") self.ys = eval(self.yEntry.get()) self.xs = x self.drawPlot()
self.drawPlot就是核心的繪圖函數(shù),主要流程與命令行調(diào)用plt如出一轍,首先創(chuàng)建一個坐標(biāo)軸,然后在坐標(biāo)軸上繪圖,區(qū)別是最后需要調(diào)用self.canvas中的引擎來完成圖像繪制
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()
結(jié)果如下
狀態(tài)欄的這些工具都可以無縫使用,非常便捷。
到此這篇關(guān)于基于matplotlib+tkinter實現(xiàn)簡單的繪圖系統(tǒng)的文章就介紹到這了,更多相關(guān)matplotlib tkinter繪圖系統(tǒng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用內(nèi)置json模塊解析json格式數(shù)據(jù)的方法
這篇文章主要介紹了Python使用內(nèi)置json模塊解析json格式數(shù)據(jù)的方法,結(jié)合實例形式分析了Python使用內(nèi)置的json模塊實現(xiàn)json格式數(shù)據(jù)的解析、轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-07-07Python報錯ValueError:?cannot?convert?float?NaN?to?intege
在Python編程中,我們經(jīng)常需要處理各種數(shù)據(jù)類型,包括浮點數(shù)和整數(shù),然而,有時候我們可能會遇到一些意外的情況,比如將一個包含NaN(Not?a?Number)的浮點數(shù)轉(zhuǎn)換為整數(shù)時,就會拋出錯誤,本文將探討這個錯誤的原因,并給出幾種可能的解決方案,需要的朋友可以參考下2024-09-09Python 迭代,for...in遍歷,迭代原理與應(yīng)用示例
這篇文章主要介紹了Python 迭代,for...in遍歷,迭代原理與應(yīng)用,結(jié)合實例形式分析了Python迭代與遍歷的相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下2019-10-10Python實現(xiàn)一個列表分割成多個列表的四種示例
本文主要介紹了Python實現(xiàn)一個列表分割成多個列表的四種示例,包括使用循環(huán)、切片操作、itertools.groupby()和numpy的array_split(),具有一定的參考價值,感興趣的可以了解一下2024-12-12Python打包文件夾的方法小結(jié)(zip,tar,tar.gz等)
這篇文章主要介紹了Python打包文件夾的方法,結(jié)合實例形式總結(jié)分析了Python打包成zip,tar,tar.gz等格式文件的操作技巧,需要的朋友可以參考下2016-09-09Python的CGIHTTPServer交互實現(xiàn)詳解
本篇文章主要給大家詳細(xì)分析了Python的CGIHTTPServer交互實現(xiàn)過程以及相關(guān)代碼分享,有興趣的參考學(xué)習(xí)下。2018-02-02