matplotlibを使ってグラフを表示すると、通常は、matplotlib独自のウィンドウで表示されますが、これをtkinterのGUIに組み込んで表示する方法を紹介します。
基本的な処理の流れとしては、matplotlibのFigureクラスでグラフの描画領域を確保し、グラフ描画用の座標軸を作成します。
FigureCanvasTkAggクラスで作成したFigureとFigureの配置先のウィジェットを指定し、matplotlib用のキャンバスを作成します。
グラフを描画する時は、作成した軸に対してグラフを描画し、最後にFigureCanvasTkAggクラスで作成したオブジェクトのdraw()メソッドを呼び出して、グラフを表示します。
以下にできるだけシンプルにしたサンプルを示します。
import tkinter as tk
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
import numpy as np
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.master.title('matplotlib graph')
#-----------------------------------------------
# matplotlib配置用フレーム
frame = tk.Frame(self.master)
# matplotlibの描画領域の作成
fig = Figure()
# 座標軸の作成
self.ax = fig.add_subplot(1, 1, 1)
# matplotlibの描画領域とウィジェット(Frame)の関連付け
self.fig_canvas = FigureCanvasTkAgg(fig, frame)
# matplotlibのツールバーを作成
self.toolbar = NavigationToolbar2Tk(self.fig_canvas, frame)
# matplotlibのグラフをフレームに配置
self.fig_canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)
# フレームをウィンドウに配置
frame.pack()
# ボタンの作成
button = tk.Button(self.master, text = "Draw Graph", command = self.button_click)
# 配置
button.pack(side = tk.BOTTOM)
#-----------------------------------------------
def button_click(self):
# 表示するデータの作成
x = np.arange(-np.pi, np.pi, 0.1)
y = np.sin(x)
# グラフの描画
self.ax.plot(x, y)
# 表示
self.fig_canvas.draw()
root = tk.Tk()
app = Application(master=root)
app.mainloop()
(実行結果)
ポイント
Figureは、今回のやり方とは別に、通常のmatplotlibのウィンドウで表示する場合は、
import matplotlib.pyplot as plt
fig = plt.figure()
のようにする場合もありますが、このようにすると、tkinterで作成したウィンドウの×ボタンでプログラムを終了させても、プロセスが終了しない状態になってしまうので、注意が必要です。
参考
https://matplotlib.org/stable/gallery/user_interfaces/embedding_in_tk_sgskip.html