回り道しながら一歩ずつ

回り道しながら一歩ずつ

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

【Python】Tkinterで足す・引く・掛ける・割るを自由に選択できる計算機を作ってみた | プログラミング

Tkinterで足す・引く・掛ける・割るを選択できる計算機を作ってみたのメインイメージ
前回は、TkinterのEntryとButtonを使って、ボタンをクリックするとフォームに入力した数値を足し算し、結果フォームに答えが出力されるツールを作成しました。ずいぶん時間はかかりましたが、思ったことが形にできて満足してます。

myroad.hatenablog.com

今回は前回作成したツールの改良版で、ラジオボタンを使って、足す引く掛ける割るを選択できるようにするツールを作ってみました。

Tkinterラジオボタンを設置

Tkinterラジオボタンを追加する方法も、他のウィジェットと同様で以下のようにインスタンス化を行う必要があります。

radiobtn = tkinter.Radiobutton

今回作成する計算機が、足す引く掛ける割るラジオボタンで選択して計算する計算機になるため、GUIに4つのラジオボタンを設置する必要があります。完成イメージはこんな感じです。
入力式計算ツール完成形
1つ1つボタンを設置すると、同じようなコードを4つ書く必要があるので手間だと思っていたのですが、参考にさせていただいたブログが、For文を使ってラジオボタンを設置していたので、コードの省略にもなるし便利だと思って同じ方法をまねてみたのですが、どのような仕組みになっているのか解読するのに時間がかかりました。
For文の抜粋が以下のような感じです。

# ↓タプルに格納された演算子の数分for文を回してラジオボタンを作る
for i in range(len(calc)):
    rdbtn = tkinter.Radiobutton(master=root, value = i, variable=var, text=calc_name[i], command=Change_stats)
    rdbtn.place(x=30 + (i*60), y=20)

len()は設定された引数の値を取得する関数で、さらにfor i in rangeで取得した値分、for文を実行します。ラジオボタンインスタンスのカッコ内のvalue=ifor i in rangeiで、for文が実行されるたびにcalcから取得した値を追加し、text=calc_name[i]iも同様の値を追加して、ラジオボタンの名称を表示させています。

ラジオボタンの変更に合わせて表示している演算子を変更

選択されたラジオボタンの値(varに格納されている)を取得し、if文をつかってどの演算子と一致するかを判定して、一致した演算子を表示するようにしました。

# ↓ラジオボタン変更時に実行される関数
def Change_stats():
    checked = var.get()
    if (checked == 0):
        # ↓ラジオボタンの状態に応じて演算子を変えるIF文
        plus_label = tkinter.Label(master=root, text='+', font=20)
        plus_label.place(x=135, y=70)
    elif (checked == 1):
        # ↓ラジオボタンの状態に応じて演算子を変えるIF文
        plus_label = tkinter.Label(master=root, text='-', font=20)
        plus_label.place(x=135, y=70)
    elif (checked == 2):
        # ↓ラジオボタンの状態に応じて演算子を変えるIF文
        plus_label = tkinter.Label(master=root, text='×', font=20)
        plus_label.place(x=135, y=70)
    else:
        # ↓ラジオボタンの状態に応じて演算子を変えるIF文
        plus_label = tkinter.Label(master=root, text='÷', font=20)
        plus_label.place(x=135, y=70)

ここの処理は、もう少しコードを減らせそうですが今の自分の力量ではごれが限界ですね。。

計算処理を実施する関数の作成

前回の処理を使って、ラジオボタンに設定された演算子に連動し、足す引くなどを実行させるのにだいぶ苦労しました。
というのも、もともとeval()という関数の知らなかったため、文字列型の計算式をちゃんと計算できるようにするには、どうすればいいのか全く見当がつかなかったので、手あたり次第に検索して、やっとeval()の存在をしりました。 参考にさせていただいた、このブログには本当に感謝です。
pythonで文字列を式として計算するeval()関数 - Qiita

# ↓ボタンクリック時に実行される関数
def Calculation():
    enzanshi = var.get()
    val_1 = str(num_area_1.get())
    val_2 = str(num_area_2.get())
    # ↓文字列状態の式を実行
    answer = eval(val_1 + calc[enzanshi] + val_2)
    answer_ent.delete(0, tkinter.END)
    answer_ent.insert(0, answer)

以下が今回のソースコードの全文です。

#! /usr/bin/env python
import tkinter

# ↓ボタンクリック時に実行される関数
def Calculation():
    enzanshi = var.get()
    val_1 = str(num_area_1.get())
    val_2 = str(num_area_2.get())
    # ↓文字列状態の式を実行
    answer = eval(val_1 + calc[enzanshi] + val_2)
    answer_ent.delete(0, tkinter.END)
    answer_ent.insert(0, answer)

# ↓ラジオボタン変更時に実行される関数
def Change_stats():
    checked = var.get()
    if (checked == 0):
        # ↓ラジオボタンの状態に応じて演算子を変えるIF文
        plus_label = tkinter.Label(master=root, text='+', font=20)
        plus_label.place(x=135, y=70)
    elif (checked == 1):
        # ↓ラジオボタンの状態に応じて演算子を変えるIF文
        plus_label = tkinter.Label(master=root, text='-', font=20)
        plus_label.place(x=135, y=70)
    elif (checked == 2):
        # ↓ラジオボタンの状態に応じて演算子を変えるIF文
        plus_label = tkinter.Label(master=root, text='×', font=20)
        plus_label.place(x=135, y=70)
    else:
        # ↓ラジオボタンの状態に応じて演算子を変えるIF文
        plus_label = tkinter.Label(master=root, text='÷', font=20)
        plus_label.place(x=135, y=70)
    

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

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

# ↓タプル型に四則演算子を格納
calc = ('+', '-', '*', '/')

# ↓タプル型に四則演算子の名称を格納
calc_name = ('足す', '引く', '掛ける', '割る')

# ↓ラジオボタンの初期状態を設定
var = tkinter.IntVar()
var.set(0)

# ↓ラジオボタンの状態を取得
var.get()

# ↓タプルに格納された演算子の数分for文を回してラジオボタンを作る
for i in range(len(calc)):
    rdbtn = tkinter.Radiobutton(master=root, value = i, variable=var, text=calc_name[i], command=Change_stats)
    rdbtn.place(x=30 + (i*60), y=20)

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

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

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

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

# ↓最初に表示する演算子ラベル
Change_stats()

root.mainloop()

今回は、if文やfor文といった条件分岐など覚えたての知識と、evalという新たな関数をフルに活用して思った通りの計算機を作成することができました。次回、どういったものを作るか、まだ検討中ですが、少しずつボリュームのあるソースコードが掛けるようになり、できることも増えてきたので楽しくなってきました。このモチベーションを維持したまま、勉強がんばっていきます。では、本日はここまで。