Python 関数でモジュール化する

目次

🔧 必要なライブラリ(インストールしてなければ)

pip install matplotlib numpy

Pythonで2次曲線(放物線)を描く

Pythonで2次曲線(放物線)
y=ax2+bx+cy = ax^2 + bx + c
を描く基本コードはこちらです👇

import numpy as np
import matplotlib.pyplot as plt

# 係数を指定
a = 1
b = -3
c = 2

# xの範囲を定義(-10〜10)
x = np.linspace(-10, 10, 400)

# 2次関数の計算
y = a * x**2 + b * x + c

# グラフを描画
plt.plot(x, y, label=f'y = {a}x² + {b}x + {c}', color='green')

# 装飾
plt.title('Quadratic Curve')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.axhline(0, color='black', linewidth=0.5)  # x軸
plt.axvline(0, color='black', linewidth=0.5)  # y軸
plt.legend()

# 表示
plt.show()

🔧 パラメータ調整

  • a: 曲線の開き具合と向き(正なら上に開く、負なら下)
  • b: 傾き(xの1次項)
  • c: y切片(y軸との交点)

Windowを モジュール化する

コード構成で関数をモジュール化して読みやすくします 👍
この Tkinter ウィンドウに グラフを描画するパネル(Matplotlib)を追加したいということですね!

以下に「TkinterウィンドウにMatplotlibグラフ(2次関数 y = ax² + bx + c)を埋め込む」よう改良したコードを紹介します👇

"""
◇関数でモジュール化する
# 関数で細かく分割する。
# 小さなプログラムを作る事で、分担作業やバグ修正が容易になる。
# 事前に関数(Def)で定義しておくと、呼び出しされた時だけ実行される。
"""
import tkinter as tk  # ライブラリの呼び出し

def sample_method( x, y, width, height):  # メソッド
    
    window = tk.Tk() # ライブラりをインスタンス化
    
    window.title("Tkinter Window")  # ウィンドウのタイトル
    window.geometry(f"{width}x{height}+{x}+{y}") # ウィンドウのサイズ
    window.configure(bg="gray")     # 背景色設定

    window.mainloop()  # ウィンドウを表示し続ける

if __name__ == "__main__": # プログラムが直接実行されたか確認
    sample_method( 600, 400, 650, 400)  # 関数を呼び出す

以下に「TkinterウィンドウにMatplotlibグラフ(2次関数 y = ax² + bx + c)を埋め込む」よう改良したコードを紹介します👇


モジュールをWinowに組み込む

Tkinter + Matplotlib で2次関数をプロットする

import tkinter as tk
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np

def plot_quadratic(a, b, c):
    # 数値データ作成
    x = np.linspace(-10, 10, 400)
    y = a * x**2 + b * x + c

    # Matplotlib図の作成
    fig = Figure(figsize=(6, 4), dpi=100)
    ax = fig.add_subplot(111)
    ax.plot(x, y, label=f'y = {a}x² + {b}x + {c}', color='blue')
    ax.set_title("2次関数グラフ")
    ax.set_xlabel("x")
    ax.set_ylabel("y")
    ax.grid(True)
    ax.legend()

    return fig

def sample_method(x, y, width, height):
    # Tkinterウィンドウ作成
    window = tk.Tk()
    window.title("Tkinter + Matplotlib")
    window.geometry(f"{width}x{height}+{x}+{y}")
    window.configure(bg="gray")

    # グラフの生成と配置
    fig = plot_quadratic(1, -3, 2)  # a, b, c の値を指定
    canvas = FigureCanvasTkAgg(fig, master=window)
    canvas.draw()
    canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)

    # ウィンドウ表示
    window.mainloop()

if __name__ == "__main__":
    sample_method(600, 400, 700, 500)


✅ 補足

  • plot_quadratic 関数でグラフロジックを切り出してモジュール化
  • FigureCanvasTkAgg を使うことで Matplotlib を Tkinter に統合

GUIでユーザーが入力できるようにする

いいですね!GUIで a, b, c の係数をユーザーが入力できるようにして、入力後にグラフを表示するインタラクティブなアプリにしましょう!


🎯 機能概要

  • Tkinterウィンドウに Entry で係数 a, b, c を入力
  • 「描画」ボタンを押すと、グラフを更新

✅ 改良版コード(GUIで係数入力 → グラフ描画)

import tkinter as tk
from tkinter import ttk
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np

# グラフ生成関数
def plot_quadratic(a, b, c):
    x = np.linspace(-10, 10, 400)
    y = a * x**2 + b * x + c

    fig = Figure(figsize=(6, 4), dpi=100)
    ax = fig.add_subplot(111)
    ax.plot(x, y, label=f'y = {a}x² + {b}x + {c}', color='blue')
    ax.set_title("2次関数グラフ")
    ax.set_xlabel("x")
    ax.set_ylabel("y")
    ax.grid(True)
    ax.legend()

    return fig

# メインUI関数
def sample_method(x, y, width, height):
    window = tk.Tk()
    window.title("2次関数プロッター")
    window.geometry(f"{width}x{height}+{x}+{y}")
    window.configure(bg="lightgray")

    # フレーム分け(入力とグラフ)
    top_frame = tk.Frame(window, bg="lightgray")
    top_frame.pack(side=tk.TOP, fill=tk.X, padx=10, pady=10)

    graph_frame = tk.Frame(window, bg="white")
    graph_frame.pack(fill=tk.BOTH, expand=True)

    # 入力欄
    tk.Label(top_frame, text="a:", bg="lightgray").pack(side=tk.LEFT)
    entry_a = ttk.Entry(top_frame, width=5)
    entry_a.insert(0, "1")
    entry_a.pack(side=tk.LEFT, padx=5)

    tk.Label(top_frame, text="b:", bg="lightgray").pack(side=tk.LEFT)
    entry_b = ttk.Entry(top_frame, width=5)
    entry_b.insert(0, "-3")
    entry_b.pack(side=tk.LEFT, padx=5)

    tk.Label(top_frame, text="c:", bg="lightgray").pack(side=tk.LEFT)
    entry_c = ttk.Entry(top_frame, width=5)
    entry_c.insert(0, "2")
    entry_c.pack(side=tk.LEFT, padx=5)

    # キャンバス保持用変数
    canvas = None

    # 描画ボタンの処理
    def draw_graph():
        nonlocal canvas
        try:
            a = float(entry_a.get())
            b = float(entry_b.get())
            c = float(entry_c.get())

            fig = plot_quadratic(a, b, c)

            # すでにキャンバスがあるなら削除
            if canvas:
                canvas.get_tk_widget().destroy()

            canvas = FigureCanvasTkAgg(fig, master=graph_frame)
            canvas.draw()
            canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)

        except ValueError:
            print("数値を正しく入力してください。")

    # ボタン
    draw_button = ttk.Button(top_frame, text="描画", command=draw_graph)
    draw_button.pack(side=tk.LEFT, padx=10)

    window.mainloop()

if __name__ == "__main__":
    sample_method(600, 400, 800, 600)

🔍 できること

  • Entry で係数入力(デフォルト値あり)
  • 入力後に「描画」ボタンで即反映
  • グラフは何度でも描き直せます!

さらに機能追加したい?たとえば:

  • 判別式(D = b² – 4ac)を表示
  • 頂点の座標を表示
  • 色を選べるようにする
    とかもできますよ~ 😄
よかったらシェアしてね!
目次