簡単なアプリを作る必要が出たので、仕事の合間に作っています。何も知らない人に機械学習とかの結果を使ってもらうのは難しいんだなと実感しています。
初めてのけいけんだし、どうせなら記事にしようという事でちょこちょこ書いていきます。勿論、開発経験も他の言語の知識もありません。今回作りたいものならpython だけでなんとかなりそうなので、頑張っていきます。
アプリの概要
学習済みのモデルにデータを食べさせて、出力をもらうという事がしたいのですが、何も知らない人に入力や読み取りの作業をしてもらうので、一連の作業を裏で行い、ボタン一つで結果が出るようにする必要があります。
作りたいアプリは以下の機能を持つものです。
- 新しく入力されたデータを読み取る
- 読み取ったデータを既に学習されているモデルが読み取れるように前処理を施す
- モデルからの出力を画面に出す
アプリ名.exe を起動すると、以下のような画面が出現するイメージです。
“データを入力してください” の下の□は入力を受け付ける場所です。
“計算”, “保存”はボタンです。□に適切な形のデータが入力された状態で計算ボタンがクリックされるとデータを前処理して学習済みモデルが予測値を”計算値”の横の□に表示します。
保存ボタンを押すと 入力したデータと計算値を台帳に保存します。
以上の事を行ってくれるアプリを作っていきます。
変な値をもらったらエラーを吐いたり、台帳に戻るとかの機能も付けるかもしれませんが、どうせ機能はクラスの中で定義するので後で考えます。
python による実装
python にはtkinter という標準ライブラリがあり、それを使うと上の機能を持ったアプリは作れそうです。以下のリンクを参考に作っていきます。
今回は外見を作ります。”データを入力してください”, “計算”ボタンの配置をします。取りあえずはjupyter notebook で書いておいて最後に.exeファイルにします。
外枠から順々に作っていきます。
外枠の表示
外枠だけなら、以下のコードで出来ます。
import tkinter as tk
root = tk.Tk()
#root.geometry("640x480") #xはエックス
root.mainloop()
詳しい事は全く知りませんが、tk.Tk()で枠を作ってくれます。 .geometry は外枠の大きさを変えてくれます。 mainloop()で実行してくれます。実行すると枠だけが表示され、右上の×ボタンをクリックすると消えます。
ボタンと文字の配置
ボタンや文字を配置していきます。1
文字はLabel()で配置することが出来、ボタンはButton()で生成できます。配置するにはpack()やgrid()が使えますが、pack()は縦1列に並べるだけみたいなので、grid()で配置します。
以下のコードで一応配置出来ます。
import tkinter as tk
root = tk.Tk()
#root.geometry("640x480")
label = tk.Label(root, text="データを入力してください。")
label.grid(row=1, columns=1)
button = tk.Button(root, text = "計算 ")
button.grid(row=2, columns=1)
label = tk.Label(root, text="計算値")
label.grid(row=3, columns=1)
button = tk.Button(root, text = "保存 ")
button.grid(row=4, columns=1)
root.mainloop()
入力用のフォームも出力用のフォームもないのでpack()で配置しても同じでしたが…
ボタンはクリック出来ますが、何も起こりません。これをクラスにまとめておきます。 2
import tkinter as tk
class App(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.create_labels()
self.create_widgets()
def create_labels(self):
self.label1 = tk.Label(self, text="データを入力していください。")
self.label1.grid(row=1, columns=1)
self.label2 = tk.Label(self, text="計算値")
self.label2.grid(row=3, columns=1)
def create_widgets(self):
self.calc = tk.Button(self)
self.calc["text"] = "計算"
self.calc.grid(row=2, columns=1)
self.save = tk.Button(self, text = "保存")
self.save.grid(row=4,columns=1)
root = tk.Tk()
app=App(master=root)
app.mainloop()
別にtk.Frameを呼び出す必要はない気がしますが、公式でそう書いてたのでそのままにしてます。tk.Frame を呼び出してるので、super で継承しています。今回はただウィジェットを配置するだけなので、関数にしておいても意味がないような気がしますが、何か共通の機能があるとこの書き方が生きてきそうです。
上のコードを実行しても同じ画面が表示されます。
今回はこれくらいで終わります。
まとめ
- python 標準のtkinter でアプリっぽいものが作れる
- tk.Tk()で枠の生成, mainloop()で実行
- Label , Buttonで文字を挿入したりボタンを設置できる