Python(英文のデータベース化007: GUI_tkinterの試し)

■Graphical User Interface(GUI)の試し。
英文のデータベース化を行うアプリをWindowsアプリケーションのようにできないかと思い、今回GUIのPythonのパッケージを使ってみる。tkinterは標準でpythonに入っているそうなので、これを使う。
やりたいこととして、次のようなものを考えてる。
 ・英文のテキストファイルをファイルダイアログで選択・読み込み
 ・英文の分解、データベース登録をボタンで実行
 ・三人称単数や過去形、進行形など処理が必要なものをラベル上で選択

今回はtkinterの試しとして、簡単なサンプルプログラムを作った。
サンプルプログラムは、2次関数(y = a * x^2 + b * x + c)の a, b, c の値をテキストボックスから入力してボタンを押すと x = -20 ~ 20 のグラフを表示するというもの。
コードは下の通り。

import tkinter as ttk
import matplotlib.pyplot as plt

FILENAME = 'sample017.png'
START_VAR = -20
END_VAR = 20

##############################
#  バージョン確認
var = ttk.Tcl().eval('info patchlevel')
print(var)
##############################

##############################
#  ファイルとして保存
def save_graph(var_a, var_b, var_c):
    x = []
    y = []
    plt.figure(figsize=(3.2, 2))
    for i in range(START_VAR, END_VAR):
        x.append(i)
        y.append(int(var_a) * (i ** 2) + int(var_b) * i + int(var_c))
    print(x)
    print(y)
    plt.plot(x, y)
    plt.tight_layout()
    plt.savefig(FILENAME)
##############################

##############################
#  ボタンを押した際の動き
def button1_method():
    save_graph(widgt2.get(), widgt3.get(), widgt3.get())
    img = ttk.PhotoImage(file=FILENAME)
    widgt6.configure(image=img)
    widgt6.image=img
##############################

root = ttk.Tk()
root.title('Function')
root.geometry("340x300")
root.resizable(0, 0)
frame = ttk.Frame(root, borderwidth =10)
frame.grid(column=4, row=4)

widgt1 = ttk.Label(frame, text="y = a * x^2 + b * x + c")
widgt2 = ttk.Entry(frame, text="a", width=10)
widgt3 = ttk.Entry(frame, text="b", width=10)
widgt4 = ttk.Entry(frame, text="c", width=10)
widgt5 = ttk.Button(frame, text="Show", bg="white", command=lambda: button1_method())
widgt6 = ttk.Label(frame)

widgt1.grid(column=0, row=0, columnspan=4)
widgt2.grid(column=0, row=1)
widgt3.grid(column=1, row=1)
widgt4.grid(column=2, row=1)
widgt5.grid(column=3, row=1)
widgt6.grid(column=0, row=2, columnspan=4)

root.mainloop()

コードの実行後、テキストボックスへ値を入力してボタンを押すと下のようになる。

フレーム(Frame)の上に6つのウィジット(ラベル_Label 2、テキストボックス_Entry 3、ボタン_Button 1)を置いている。4×4のgridを使って、適宜 columnspanで隣同士のセルを結合して、レイアウトを下の赤枠のように作っている。

ボタンの実行時の動きは、command=lambda: button1_method() で定義した関数を使う。ボタンを押すと、テキストボックスに入っている値を取得し、それらを別の関数save_graphに入れ、 matplotlibパッケージを使ってグラフを出力、保存する。その保存ファイルを読み取り、widgt6に差し替える。

今回はtkinterのサンプルまで。