回り道しながら一歩ずつ

回り道しながら一歩ずつ

プログラミングのアウトプットが中心、その他ジャンル問わず気になったことを投稿するブログ

【Python】Tkinterで入力式計算ツールを作ってみた | プログラミング

Tkinterで入力式計算ツールを作ってみたのイメージ画像
前回は、Tkinterで作ったウィンドウに計算問題と式を表示するプログラムを作成しましたが、プログラム内で入力した式と答えが表示されるだけという、あまりにも味気ないものになってしまいました。
myroad.hatenablog.com

そこで、今回はテキストエリアに数字を入力して、ボタンをクリックすると答えが表示されるという前回から一気に進化した計算ツールの作成に挑戦しました。作り終えるまでにかなりの時間と労力を費やしましたが、何とか自分がやりたいことが形になったので達成感は半端ないですね。

TkinterのEntryで入力した値の取得が難しい

まず作成した完成形ツールがこちらです。 入力式計算ツール完成形
前回は、TkinterのLabelというウィジェットGUIのパーツ)使って、数式と答えを表示させましたが、今回は足し算する数値を入力するフォームと結果が表示されるフォーム、結果を表示するボタンを作成するウィジェットを使用しました。

Entry・・入力フォーム、フォントサイズやフォームの長さなどを指定可能
使用例)tkinter.Entry(width=任意の数値,font=任意の数字)
Button・・ボタン、ボタン上に表示する文字列やボタンサイズ、クリック時に実行する関数などを指定可能
使用例)tkinter.Button(text='表示したい文字列'width=任意の数値)

また、今回のツールを作成するにあたって必要となった知識が関数の知識です。関数は書籍でもだいぶ後の方に出てくる内容だったので、先に学習すべき部分を飛ばして関数を勉強しました。関数を勉強した率直な感想は、『いろいろな処理をまとめることができ、使いたいときに呼び出して何度でも使える汎用性の高さが素晴らしい!だけど難しい…』です。関数は書き方が以下のように、書き方が決まっています。

def xxxx:   #(xxxxは任意の名称)のあとは必ず「:」コロンを入力
  print(xxx)  #コロンの後は、コードの前にスペース(半角4つが推奨)を挿入

使用するときは、

xxxx()   #xxxxのあとに(カッコ)を入力

開発に入る前の学習でだいぶ時間を費やしましたが、何とか書ききったコードがこちらです。

#! /usr/bin/env python
import tkinter

# ↓ボタンクリック時に実行される関数
def Calculation():
    val_1 = int(num_area_1.get())
    val_2 = int(num_area_2.get())
    answer = val_1 + val_2
    answer_ent.delete(0, tkinter.END)
    answer_ent.insert(0, answer)

# ↓ベースとなるGUIの作成
root = tkinter.Tk()

# ↓GUIのタイトル
root.title(u'Pythonで足し算')
# ↓GUIのサイズ
root.geometry('320x100')

# ↓GUI上にプラス演算子を表示するラベル
plus_label = tkinter.Label(master=root, text='+', font=20)
plus_label.place(x=135, y=20)

# ↓テキストエリア作成,計算問題を入力する
num_area_1 = tkinter.Entry(master=root, width=5, font=20)
num_area_1.place(x=60, y=20)

# ↓テキストエリア作成,計算問題を入力する
num_area_2 = tkinter.Entry(master=root, width=5, font=20)
num_area_2.place(x=180, y=20)

# ↓ボタン作成,クリックで計算処理を実行する
answer_btn = tkinter.Button(master=root, text='Answer', command=Calculation)
answer_btn.place(x=240, y=20)

# ↓計算結果が表示されるラベル
answer_ent = tkinter.Entry(master=root, width=5, font=20)
answer_ent.place(x=60, y=60)
root.mainloop()

ツールを完成させるにあたって一番時間がかかったのが、入力した数値を関数に渡すところです。 num_area_1 = tkinter.Entry(master=root, width=5, font=20)が一つ目の数値が入力されるフォームですが、num_area_1変数に数値が入力されるので、関数内でnum_area_1を使用したら格納された状態だと思ったのですが、実行してもエラーが表示されるし、どこが間違っているのかさっぱりでした。何度見ても分からないことは、あまり悩みすぎず検索することが解決の早道ですね。Tkinter Entry 値 取得で検索すると、あっさり答えが分かりました。あんなに悩んでいた時間はなんだったのか…
Entryから値を取得するには、 Entry名称 + .get()と記述しないといけないみたいですね。

num_area_1.get()

これで、ようやく前に進むことができました。
あと、今回はウィジェットの位置指定にplaceを使用しました。packだと思うような位置に配置できなかったので…placeはウィンドウの左上を起点に(x , y)で指定できるので、個人的に調整がしやすかったです。フォームとフォームの間に「+」をラベルで表示することも簡単でした。

まとめ

今回初めて関数を使用して、本当に便利なものだと感じたので、使いこなせるようにもっと勉強頑張っていきたいですね。
次は、今回作成したプログラムを発展させて、もう少し色々な計算ができるツールにしたいと思います。