(注)ここでは最終結果だけでなくエラーの試行錯誤も含めて書いていきます。
また中途半端でもアップし後々更新することとします。
目的
以前行った回帰分析をGUI化してみます。
GUI化方法
ライブラリ
ググってみるとtkinterというツールがあるようなので試してみます。
開発環境
今まではjupyterで開発していましたが、Spiderに変えます。
jupyterは使いやすいのですが、各セル単位で文法チェックしてしまうため
後に書いておくものがチェック対象にならずエラーとなるのが面倒と考えたためです。
作ってみる
とりあえず画面を作ってみます。
import tkinter
root = tkinter.Tk()
root.title(u'My First App')
root.geometry("600x450")
root.mainloop()
意外と簡単そうですねえ。
では入力欄を作成します。
label1 = tkinter.Label(text=u'4営業日前:',font=8)
label1.pack()
label2 = tkinter.Label(text=u'3営業日前:',font=8)
label2.pack()
label3 = tkinter.Label(text=u'2営業日前:',font=8)
label3.pack()
label4 = tkinter.Label(text=u'1営業日前:',font=8)
label4.pack()
label5 = tkinter.Label(text=u'予想結果:',font=8)
label5.pack()
label6 = tkinter.Label(text=u'xxxxx円',font=8)
label6.pack()
Entry1 = tkinter.Entry(font=8)
Entry1.pack()
Entry2 = tkinter.Entry(font=8)
Entry2.pack()
Entry3 = tkinter.Entry(font=8)
Entry3.pack()
Entry4 = tkinter.Entry(font=8)
Entry4.pack()
かっこ悪い・・・
packではなくplaceとすることで位置決めできるみたいなので変えてみます。
ただし画面の大きさに応じてみたいなことができなくなってしまうようなので一長一短ですが。
label1 = tkinter.Label(text=u'4営業日前:',font=8)
label1.place(x=50,y=50)
(略)
Entry4 = tkinter.Entry(font=8)
Entry4.place(x=200,y=200)
ボタン追加します。押したときにcalcNikkeiで計算させます。
Button1 = tkinter.Button(text=u'予測します。', font=8)
Button1.bind("<Button-1>", calcNikkei)
Button1.place(x=100,y=300)
root.bind('<Return>', calcNikkei)
Button1.bind("", calcNikkei)
bindについて解説
- 1つ目:"":対象行為。これは左クリック。 「Button-2」真ん中クリック、「Button-3」は右クリック C++、VBなどではOnClick()イベントみたいなイメージ
- 2つ目:calcNikkeiがよびだす関数。
root.bind('', calcNikkei)
- これはroot画面でリターンキーを押したときcalcNikkeiを実行
- C++、VBなどではButton1のdefault=trueのようなイメージ。
値の読み取り
floatでないといけないのでチェックが必要です。
さてチェックし方ですかpythonではgotoで飛ばせそうもないのでtry-catchで対応します。
retをTrueで初期化し、Falseとしエラーの場合にメッセージ表示させます。
ret = True
if ret:
try:
val1 = float(Entry1.get())
except ValueError:
msg.showerror(title = '4日前のエラー', message = u'4日前の値が数字ではありません')
ret = False
この調子で入力欄4まで判定します。
ここまでで1つでもエラーの場合はretはFalseになっていますので計算結果は表示しません。Trueの場合のみ入力欄1~4の値で計算します。
if ret:
test_data = np.array([[val1,val2,val3,val4]])
predicted = reg.predict(test_data)
label6["text"] = str(predicted.tolist()[0]) + "円"
else:
label6["text"] = "xxxxx円"
クリアボタン、終了ボタン等も作成しています。
メニューバー等を作ってみたいですね。
ソース
とりあえず並べただけのソースです。
画面作成部分はクラス化できそうですかね。
学習データも選択できるようにできれば。