だぶるばいせっぷす 新館

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

【プログラミング】 python奮闘記 その17 ~一応の完成?

この記事は、現在進行系でゼロからプログラミングを勉強している私が、勉強の一環として進展状況をアウトプットする目的で投稿しています。
その為、間違った記述や無駄な作業が結構多めとなっていますが、『それでも良いから一緒に勉強している気になりたい』という方に向けて書いていますので、予め御了承ください。

前回は、リストという一つの変数に複数の値を代入する方法を勉強しました。
という事で早速、今作っているものにリストを組み込んでいこうと思います。
kimniy8.hatenablog.com

まず、今作っている自動見積りツールですが、数値が固定されているものは材料単価だけです。
この材料単価をリストに入れて、必要なものだけ取り出すという方法を使えば、結構便利そうです。
今現在、単価を打ち込んでいる部分はこんな感じの記述になっています

    if cardboard_a:
        cardboard_price["text"] = "ボール紙の価格" + str(40) + "円"
    elif cardboard_b:
        cardboard_price["text"] = "ボール紙の価格" + str(50) + "円"

(40)や(50)という数字の記述がありますが、仮に、材料単価の見直しが有った際には、これらを手書きで直していかなければなりません。
その際に、見落としなどがあると計算に誤差が出たりもするので、管理が結構面倒。
という事で、単価の元データを作り、そこにアクセスして数値を引っ張ってくるようにします。

    # ボール紙の価格 cardboard plice
    cp=[40, 50, 70, 100]

ボール紙の単価、略称でcpという変数を作り、リストとして単価を打ち込みます。
そして、先程の記述の部分はこんな感じで修正

    if cardboard_a:
        cardboard_price["text"] = "ボール紙の価格" + str(cp[0]) + "円"
    elif cardboard_b:
        cardboard_price["text"] = "ボール紙の価格" + str(cp[1]) + "円"

こうする事で、価格を変更する際には、先程のリストの数値を変更するだけで数字が変更されるはずです。
ついでに、紙の価格もリスト化して変数に入れてしまいましょう。

    # 紙の価格 paper plice
    pp=[[50, 65, 60, 70],[70, 100, 90, 110],[100, 135, 120, 160],[160, 235, 220, 280]]
    pp_f=[[50, 65, 75, 90],[70, 100, 115, 140],[100, 135, 160, 200],[160, 235, 285, 360]]

紙の価格の場合は、蓋と身で価格が微妙に違うので、2つのリストを用意します。
2つのリスト共に、リストの中にリストを入れる感じで管理します。
呼び出し方は、はじめに外枠の方のリスト番号を指定し、次に、内側のリスト番号を指定します。
例えば、ppのリストの中の2つ目のリストの3番目の数字である90を呼び出すためには

pp[1][2]

といった感じで、指定すれば大丈夫です。
リストの番号は0から始めるため、2つ目の要素にアクセスしようと思うと、[1]と打たなければならないので注意が必要です。

紙の単価のリストも用意が出来たので、後は、単価を振り分ける際のif文に、追加で紙の項目を書き足すだけです。
ただ、よくよく見ると、一つ一つのif文で、表示される文字全てを書くのは、面倒。。
というか、何度も書きますが、プログラムって面倒くさいことを機械に自動で行わせるはずのものなのに、プログラムので同じ事を何度も書くというのがナンセンスな気もする…

という事で、if文の文字を書き換えると同時に、ツールのレイアウトも少しイジろうと思います。
今までは、内訳表示の部分を、関数が実行されたらまるまる書き買える状態にしていましたが、単価表示部分は固定表示にして、〇〇円という表記が追加されるだけにします。

cardboard = tkinter.Label(frame4, text="【身】ボール紙の価格")
cardboard.grid(column=0,row=2, padx=5)
cardboard_price = tkinter.Label(frame4)
cardboard_price.grid(column=1,row=2, padx=5)

こんな感じで、価格の説明は固定表示にして、新たに『cardboard_price』という変数を作って、関数実行時にはこの変数に金額を代入します。
準備が出来たので、次は、価格表示をさせる部分を書いていきます。

        # 身のボール紙の価格
        if cardboard_a:
            c_p = cp[0]
            if radio1 == 0:
               p_p = pp[0][0]
            elif radio1 == 1:
               p_p = pp[0][1]
            elif radio1 == 2:               
               p_p = pp[0][2]
            elif radio1 == 3:
               p_p = pp[0][3]

        elif cardboard_b:
            c_p = cp[1]
            if radio1 == 0:
                p_p = pp[1][0]
            elif radio1 == 1:
                p_p = pp[1][1]

冒頭で書いていた部分を、こんな感じで書き直します。
『c_p』と『p_p』という新たな変数を作り、if文によって、各条件に合った単価のリストを呼び出して代入していきます。
『cardboard_a』という条件に当てはまる場合は、ボール紙の単価はcpリストの0番目になります。
そして、ラジオボタンの選択によって、『p_p』に紙の価格リストから数値が呼び出されます。

if文の条件分枝によって選ばれた価格は、最終的にこんな感じで、先程作った『cardboard_price』等の表示スペースに代入します。

        cardboard_price["text"] = str(c_p) + "円"
        cardboard_price_f["text"] = str(c_p_f) + "円"
        paperprice["text"] = str(p_p) + "円"
        paperprice_f["text"] = str(p_p_f) + "円"
        answer["text"] =str(c_p + c_p_f + p_p + p_p_f) + "円"

そして、全ての価格が出揃ったところで、それらを全て足して、『answer』という場所に代入することで、合計金額が表示されます。
これで、やっと完成です!
f:id:kimniy8:20180710221911j:plain
ただ、このコード、結構、同じことの繰り返しを書いていたりしてるんですよね…
という事で次回は、もう少し簡素な感じに加工しようと思います。
今回作ったコードがこちら。

import tkinter

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

# テキスト表示
frame1 = tkinter.Frame(root)
heading = tkinter.Label(frame1, text="お見積り")
heading.pack()

# テキストボックス表示
frame2 = tkinter.Frame(root)
box_width = tkinter.Entry(frame2, width=10, bd=4)
box_width.grid(column=0,row=0, padx=5)

box_length = tkinter.Entry(frame2, width=10, bd=4)
box_length.grid(column=1,row=0, padx=5)

box_height = tkinter.Entry(frame2, width=10, bd=4)
box_height.grid(column=2,row=0, padx=5)

box_height_f = tkinter.Entry(frame2, width=10, bd=4)
box_height_f.grid(column=2,row=1, padx=5)
# ボタン表示
askbutton = tkinter.Button(frame2, text="見積開始")
askbutton.grid(column=3,row=0, padx=5)

# ラジオボタン 紙の選択
frame5 = tkinter.Frame(root)

radio1_val = tkinter.IntVar()
radio1_val.set(0)
paper_a = tkinter.Radiobutton(frame5, text = "紙【a】", variable = radio1_val, value = 0)
paper_a.pack(side = tkinter.LEFT)
paper_b = tkinter.Radiobutton(frame5, text = "紙【b】", variable = radio1_val, value = 1)
paper_b.pack(side = tkinter.LEFT)
paper_c = tkinter.Radiobutton(frame5, text = "紙【c】", variable = radio1_val, value = 2)
paper_c.pack(side = tkinter.LEFT)
paper_d = tkinter.Radiobutton(frame5, text = "紙【d】", variable = radio1_val, value = 3)
paper_d.pack(side = tkinter.LEFT)

frame6 = tkinter.Frame(root)
radio2_val = tkinter.IntVar()
radio2_val.set(0)
paper_a_f = tkinter.Radiobutton(frame6, text = "紙【a】", variable = radio2_val, value = 0)
paper_a_f.pack(side = tkinter.LEFT)
paper_b_f = tkinter.Radiobutton(frame6, text = "紙【b】", variable = radio2_val, value = 1)
paper_b_f.pack(side = tkinter.LEFT)
paper_c_f = tkinter.Radiobutton(frame6, text = "紙【c】", variable = radio2_val, value = 2)
paper_c_f.pack(side = tkinter.LEFT)
paper_d_f = tkinter.Radiobutton(frame6, text = "紙【d】", variable = radio2_val, value = 3)
paper_d_f.pack(side = tkinter.LEFT)


# 答え表示
frame3 = tkinter.Frame(root)
ans_titl = tkinter.Label(frame3, text="一箱あたりの価格(税抜き)")
ans_titl.pack(side = tkinter.LEFT)
answer = tkinter.Label(frame3, text="円")
answer.pack(side = tkinter.LEFT)

# 内訳表示
frame4 = tkinter.Frame(root)
b_areax = tkinter.Label(frame4, text="ボール紙の身の横幅")
b_areax.grid(column=0,row=0, padx=5)
b_areay = tkinter.Label(frame4, text="ボール紙の身の縦幅")
b_areay.grid(column=1,row=0, padx=5)

b_areax_f = tkinter.Label(frame4, text="ボール紙の蓋の横幅")
b_areax_f.grid(column=0,row=1, padx=5)
b_areay_f = tkinter.Label(frame4, text="ボール紙の蓋の縦幅")
b_areay_f.grid(column=1,row=1, padx=5)

cardboard = tkinter.Label(frame4, text="【身】ボール紙の価格")
cardboard.grid(column=0,row=2, padx=5)
cardboard_price = tkinter.Label(frame4)
cardboard_price.grid(column=1,row=2, padx=5)

cardboard_f = tkinter.Label(frame4, text="【蓋】ボール紙の価格")
cardboard_f.grid(column=0,row=3, padx=5)
cardboard_price_f = tkinter.Label(frame4)
cardboard_price_f.grid(column=1,row=3, padx=5)

paper = tkinter.Label(frame4, text="【身】の紙の価格")
paper.grid(column=0,row=4, padx=5)
paperprice = tkinter.Label(frame4)
paperprice.grid(column=1,row=4, padx=5)

paper_f = tkinter.Label(frame4, text="【蓋】の紙の価格")
paper_f.grid(column=0,row=5, padx=5)
paperprice_f = tkinter.Label(frame4)
paperprice_f.grid(column=1,row=5, padx=5)

# Frame配置
frame1.pack()
frame3.pack()
frame2.pack()
frame5.pack()
frame6.pack()
frame4.pack()
# ボール紙の大きさ
def ask_click():
    b_hi = int(box_height.get()) # 箱の高さ
    b_hi_f = int(box_height_f.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_f*2 # ボール紙の蓋の縦
    b_yoko_f = b_wid + 5 + b_hi_f*2 # ボール紙の蓋の横
    
    # ラジオボタンの値取得
    radio1 = radio1_val.get()
    radio2 = radio2_val.get()

    # 紙の価格 paper plice
    pp=[[50, 65, 60, 70],[70, 100, 90, 110],[100, 135, 120, 160],[160, 235, 220, 280]]
    pp_f=[[50, 65, 75, 90],[70, 100, 115, 140],[100, 135, 160, 200],[160, 235, 285, 360]]
    
    # ボール紙の価格 cardboard plice
    cp=[40, 50, 70, 100]

    # 身のボール紙の種類
    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
    
    # NG要項
    if b_hi > 100 or b_hi < 20 or b_wid < 70 or b_long < 70 \
       or not(max(b_tate, b_yoko) <= 600 or min(b_tate, b_yoko) <= 450):
        answer["text"] = "申し訳ございませんが、弊社の設備では製造できません"
        
    else:                
        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:
            c_p = cp[0]
            if radio1 == 0:
               p_p = pp[0][0]
            elif radio1 == 1:
               p_p = pp[0][1]
            elif radio1 == 2:               
               p_p = pp[0][2]
            elif radio1 == 3:
               p_p = pp[0][3]

        elif cardboard_b:
            c_p = cp[1]
            if radio1 == 0:
                p_p = pp[1][0]
            elif radio1 == 1:
                p_p = pp[1][1]
            elif radio1 == 2:
                p_p = pp[1][2]
            elif radio1 == 3:
                p_p = pp[1][3]
                
        elif cardboard_c:
            c_p = cp[2]
            if radio1 == 0:
                p_p = pp[2][0]
            elif radio1 == 1:
                p_p = pp[2][1]
            elif radio1 == 2:
                p_p = pp[2][2]
            elif radio1 == 3:
                p_p = pp[2][3]

        elif cardboard_d:
            c_p = cp[3]
            if radio1 == 0:
                p_p = pp[3][0]
            elif radio1 == 1:
                p_p = pp[3][1]
            elif radio1 == 2:
                p_p = pp[3][2]
            elif radio1 == 3:
                p_p = pp[3][3]

            
        # 蓋のボール紙の価格
        if cardboard_a_f:
            c_p_f = cp[0]
            if radio2 ==0:
                p_p_f = pp_f[0][0]
            elif radio2 ==1:
                p_p_f = pp_f[0][1]
            elif radio2 ==2:
                p_p_f = pp_f[0][2]
            elif radio2 ==3:
                p_p_f = pp_f[0][3]
        elif cardboard_b_f:
            c_p_f = cp[1]
            if radio2 ==0:
                p_p_f = pp_f[1][0]
            elif radio2 ==1:
                p_p_f = pp_f[1][1]
            elif radio2 ==2:
                p_p_f = pp_f[1][2]
            elif radio2 ==3:
                p_p_f = pp_f[1][3]

        elif cardboard_c_f:
            c_p_f = cp[2]
            if radio2 ==0:
                p_p_f = pp_f[2][0]
            elif radio2 ==1:
                p_p_f = pp_f[2][1]
            elif radio2 ==2:
                p_p_f = pp_f[2][2]
            elif radio2 ==3:
                p_p_f = pp_f[2][3]

        elif cardboard_d_f:
            c_p_f = cp[3]
            if radio2 ==0:
                p_p_f = pp_f[3][0]
            elif radio2 ==1:
                p_p_f = pp_f[3][1]
            elif radio2 ==2:
                p_p_f = pp_f[3][2]
            elif radio2 ==3:
                p_p_f = pp_f[3][3]
        
        cardboard_price["text"] = str(c_p) + "円"
        cardboard_price_f["text"] = str(c_p_f) + "円"
        paperprice["text"] = str(p_p) + "円"
        paperprice_f["text"] = str(p_p_f) + "円"
        answer["text"] =str(c_p + c_p_f + p_p + p_p_f) + "円"
askbutton["command"] = ask_click            
# メインループ
root.mainloop()