matplotlib 是繪圖界最通用的庫,功能強大,與其他系統整合友好,比如Python內建的繪圖模組tkinter,這篇文章的主要目標:實現一個使用tkinter整合matplotlib互動繪圖案例。
tkinter模組設計精簡,滿足一些小型GUI設計,首先建立一個窗體物件,新增基本元件,如Label,Button,Radiobutton等,再pack或grid元件到父容器中。
此案例,建立tkinter視窗及元件的程式碼,如下:
window = tk.Tk()# 第2步,給視窗的視覺化起名字window.title('My Window')# 第3步,設定視窗的大小(長 * 寬)# 這裡的乘是小xwindow.geometry('1200x600')# 第4步,在圖形介面上建立一個標籤label用以顯示並放置# 定義一個var用來將radiobutton的值和Label的值聯絡在一起.var = tk.StringVar()l = tk.Label(window, bg='yellow', width=30, height=3, text='matplotlib in tkinter', font=('Arial', 21))l.pack()
上面建立一個基本窗體,在上面建立Radiobutton元件,其父窗體是window物件。
然後建立一個frame物件,在裡面,再填充2個frame物件,一個位於左側,另一個位於右側:
# 第二層frame,左frame,長在主frame上frame_l = tk.Frame(frame)# 第二層frame,右frame,長在主frame上frame_r = tk.Frame(frame)frame_l.pack(side='left')frame_r.pack(side='right')
然後,在左側frame中建立柱狀圖,右側frame中建立餅狀圖。
下面就是最重要的tkinter和matplotlib整合部分,matplotlib提供FigureCanvasTkAgg物件,只需三行程式碼,實現圖形繪製在tkinter的Canvas中:
canvas_l = FigureCanvasTkAgg(figure_l, frame_l)# 用draw代替canvas_l.draw()canvas_l.get_tk_widget().pack()
第一行程式碼實現figure物件(matplotlib物件)與frame物件(tkinter元件)關係的建立,第二行使用整合後的物件中的draw方法繪圖,最後拿到tkinter元件並組裝到tkinter中。
最終實現的展示效果如下:
互動部分,選中Radiobutton中bar選項後,僅顯示柱狀圖:
選中pie選項時,僅顯示餅狀圖:
當選中both選項後,恢復全部顯示。