だぶるばいせっぷす 新館

ホワイトカラーではないブルーカラーからの視点

【プログラミング】 python奮闘記 その12 ~ifでカテゴリー分けをする

この記事は、現在進行系でゼロからプログラミングを勉強している私が、勉強の一環として進展状況をアウトプットする目的で投稿しています。
その為、間違った記述や無駄な作業が結構多めとなっていますが、『それでも良いから一緒に勉強している気になりたい』という方に向けて書いていますので、予め御了承ください。
前回は、ボタンを押すことで関数が実行されるという状態にして、その上で、実行される関数を作り始めました。
最終的には、ボタンを押すと見積価格が出るようにするところを目指します。
kimniy8.hatenablog.com
見積ソフトは、極論をいえば見積価格さえ出れば良いのですが、ボタンを押すことで単純に答えだけが出力されるよりも、材料の単価などが出てくれた方が、見積に説得力があります。
どちらにしても、計算の過程で材料単価は出てくることになるので、見積の詳細表示として、単価を表示させるようにしてみましょう。
念の為にもう一度、ボール紙のカテゴリーや単価の表を貼り付けておきますね。
f:id:kimniy8:20180604224543j:plain
まずは、ボール紙のカテゴリー分けです。
関数内で行った『ボール紙の大きさ』の変数の定義の直ぐ下辺りに、こんな感じで書いていきます。

    # 身のボール紙の種類
    cardboard_a = max(b_tate, b_yoko) <= 232 and min(b_tate, b_yoko) <= 222
    cardboard_b = max(b_tate, b_yoko) <= 354 and min(b_tate, b_yoko) <= 323
    cardboard_c = max(b_tate, b_yoko) <= 505 and min(b_tate, b_yoko) <= 354
    cardboard_d = max(b_tate, b_yoko) <= 748 and min(b_tate, b_yoko) <= 505

    # 蓋のボール紙の種類
    cardboard_a_f = max(b_tate_f, b_yoko_f) <= 232 and min(b_tate_f, b_yoko_f) <= 222
    cardboard_b_f = max(b_tate_f, b_yoko_f) <= 354 and min(b_tate_f, b_yoko_f) <= 323
    cardboard_c_f = max(b_tate_f, b_yoko_f) <= 505 and min(b_tate_f, b_yoko_f) <= 354
    cardboard_d_f = max(b_tate_f, b_yoko_f) <= 748 and min(b_tate_f, b_yoko_f) <= 505

変数名は、ボール紙の英語名となる『cardboard』にする事にし、それぞれのカテゴリーにa~dを付けています。
『max』とか『min』といったよく分からない物が出てきましたので、解説しましょう。
『max』と『min』は、何となく想像できるかも知れませんが、数値を比較して条件にあったものだけを抽出してくれる関数です。
『max』は、引数で渡された数字の中から大きいものを取り出す関数で『min』はその逆で、引数の中から小さい方を取り出してくれる関数です。

前にも出てきた『and』を使い、両方の条件に当てはまるものだけを変数としています。
具体的に、cardboard_aの条件を見た場合、縦横の大きい方の数値が232以下で『且つ(and)』縦横の大きさの小さい方が222以下の場合はcardboard_aに当てはまると行った感じで設定しています。
これと同じ様な方法で、a~dを設定しています。

ただ、この方法で書くと、『cardboard_d』は、全ての条件が満たされている状態になるので、何でもかんでも『cardboard_d』になってしまう可能性もあるんですけどね。
まぁ、プログラムは上から順番に読んでいくそうなので、一番条件がタイトな『_a』を一番最初に記載しているので、期待通りのカテゴリー分けをしてくれるとは思いますが…
若干不安は残りますが、今回は初めて作るプログラムという事で、テスト的な意味合いも大きいので、このままにしておこうと思います。

これで、カテゴリー分けの変数の定義は出来たわけですが、これだけでは、しっかりとカテゴリー分けが出来ているかどうかを確認できませんので、何らかの形で出力が出来るようにします。
まず、表示させるための場所を確保しましょう。
プログラムの『# 内訳表示』の部分に、以下の文を書き込みます。

cardboard_price = tkinter.Label(text="【身】ボール紙の価格")
cardboard_price.place(x=10, y=170)

cardboard_price_f = tkinter.Label(text="【蓋】ボール紙の価格")
cardboard_price_f.place(x=10, y=230)

場所の指定は『place』で指定して有るので、このコードは何処に書いても良いのですが、後から見返した時に見やすい位置に書いておくと良いと思います。
変数『cardboard_price』に、tkinterのLabelを使って、表示スペースを確保しています。
ただこのままだと、『cardboard_price』に値がない状態の時は何も表示されないので、デフォルト値として引数に『text="【身】ボール紙の価格"』を指定しておきます。

場所の確保が終わったので、次は、『cardboard_price』の定義を書いていきます。
書く場所は、関数内の変数定義の下です。 まぁ、現状では関数で変数の定義しかしてないので、一番下と言っても良いかも知れません。

        # 身のボール紙の価格
        if cardboard_a:
            cardboard_price["text"] = "ボール紙の価格" + str(40) + "円"
        elif cardboard_b:
            cardboard_price["text"] = "ボール紙の価格" + str(50) + "円"
        elif cardboard_c:
            cardboard_price["text"] = "ボール紙の価格" + str(70) + "円"
        elif cardboard_d:
            cardboard_price["text"] = "ボール紙の価格" + str(100) + "円"
            
        # 蓋のボール紙の価格
        if cardboard_a_f:
            cardboard_price_f["text"] = "ボール紙の価格" + str(40) + "円"
        elif cardboard_b_f:
            cardboard_price_f["text"] = "ボール紙の価格" + str(50) + "円"
        elif cardboard_c_f:
            cardboard_price_f["text"] = "ボール紙の価格" + str(70) + "円"
        elif cardboard_d_f:
            cardboard_price_f["text"] = "ボール紙の価格" + str(100) + "円"

入力された数値に基づいてカテゴリー分けを行いたいので、手段としては、if文を使った条件分枝が良さそうです。
上記のように入力する事で、もし、『cardboard_a』の条件に当てはまるなら、『cardboard_price』という、先程、表示場所を確保した変数に、テキスト表示『["text"]』として、『=』以降の計算式の結果を出力してください。という命令を行っています。
足し算は文字列でしか行えないので、数字の部分を文字列に変換するために、str()で括っています。

プログラムは上から順番に読まれるので、a~dといった具合に上から順番に書く事で、カテゴリー分けがしっかりとされるはずです。
早速テストしてみましょう。
f:id:kimniy8:20180613210427j:plain
成功です!!
という事で、今回はここまでで、次回は、更に別の設定を付け加えていきます。

今までのコードのまとめはこちら

import tkinter

# ウィンドウ作成
root = tkinter.Tk()
root.title("見積もり")
root.minsize(640, 480)

# 画像表示
canvas = tkinter.Canvas(bg="black", width=640, height=480)
canvas.place(x=0, y=0)


# テキスト表示
heading = tkinter.Label(text="お見積り")
heading.place(x=10, y=10)


# テキストボックス表示
box_width = tkinter.Entry(width=10, bd=4)
box_width.place(x=10, y=40)

box_length = tkinter.Entry(width=10, bd=4)
box_length.place(x=110, y=40)

box_height = tkinter.Entry(width=10, bd=4)
box_height.place(x=210, y=40)

# ボタン表示
askbutton = tkinter.Button(text="見積開始")
askbutton.place(x=310, y=40)


# 内訳表示
b_areax = tkinter.Label(text="ボール紙の身の横幅")
b_areax.place(x=10, y=140)
b_areay = tkinter.Label(text="ボール紙の身の縦幅")
b_areay.place(x=180, y=140)

cardboard_price = tkinter.Label(text="【身】ボール紙の価格")
cardboard_price.place(x=10, y=170)

b_areax_f = tkinter.Label(text="ボール紙の蓋の横幅")
b_areax_f.place(x=10, y=200)
b_areay_f = tkinter.Label(text="ボール紙の蓋の縦幅")
b_areay_f.place(x=180, y=200)

cardboard_price_f = tkinter.Label(text="【蓋】ボール紙の価格")
cardboard_price_f.place(x=10, y=230)

# ボール紙の大きさ
def ask_click():
    b_hi = int(box_height.get()) # 箱の高さ
    b_wid = int(box_width.get()) # 箱の幅
    b_long = int(box_length.get()) # 箱の長さ
    b_tate = b_long + b_hi*2 # ボール紙の長さ
    b_yoko = b_wid + b_hi*2 # ボール紙の幅
    b_tate_f = b_long + 5 + b_hi*2 # ボール紙の蓋の縦
    b_yoko_f = b_wid + 5 + b_hi*2 # ボール紙の蓋の横

        # 身のボール紙の種類
    cardboard_a = max(b_tate, b_yoko) <= 232 and min(b_tate, b_yoko) <= 222
    cardboard_b = max(b_tate, b_yoko) <= 354 and min(b_tate, b_yoko) <= 323
    cardboard_c = max(b_tate, b_yoko) <= 505 and min(b_tate, b_yoko) <= 354
    cardboard_d = max(b_tate, b_yoko) <= 748 and min(b_tate, b_yoko) <= 505

    # 蓋のボール紙の種類
    cardboard_a_f = max(b_tate_f, b_yoko_f) <= 232 and min(b_tate_f, b_yoko_f) <= 222
    cardboard_b_f = max(b_tate_f, b_yoko_f) <= 354 and min(b_tate_f, b_yoko_f) <= 323
    cardboard_c_f = max(b_tate_f, b_yoko_f) <= 505 and min(b_tate_f, b_yoko_f) <= 354
    cardboard_d_f = max(b_tate_f, b_yoko_f) <= 748 and min(b_tate_f, b_yoko_f) <= 505

    b_areay["text"] = "身のボール紙の身の縦" + str(b_tate) + "mm"
    b_areax["text"] = "身のボール紙の身の横" + str(b_yoko) + "mm"
    b_areax_f["text"] = "身のボール紙の蓋の縦" + str(b_tate_f) + "mm"
    b_areay_f["text"] = "身のボール紙の蓋の横" + str(b_yoko_f) + "mm"
    # 身のボール紙の価格
    if cardboard_a:
        cardboard_price["text"] = "ボール紙の価格" + str(40) + "円"
    elif cardboard_b:
        cardboard_price["text"] = "ボール紙の価格" + str(50) + "円"
    elif cardboard_c:
        cardboard_price["text"] = "ボール紙の価格" + str(70) + "円"
    elif cardboard_d:
        cardboard_price["text"] = "ボール紙の価格" + str(100) + "円"
        
    # 身のボール紙の価格
    if cardboard_a_f:
        cardboard_price_f["text"] = "ボール紙の価格" + str(40) + "円"
    elif cardboard_b_f:
        cardboard_price_f["text"] = "ボール紙の価格" + str(50) + "円"
    elif cardboard_c_f:
        cardboard_price_f["text"] = "ボール紙の価格" + str(70) + "円"
    elif cardboard_d_f:
        cardboard_price_f["text"] = "ボール紙の価格" + str(100) + "円"


askbutton["command"] = ask_click            
# メインループ
root.mainloop()