だぶるばいせっぷす 新館

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

【プログラミング】 python奮闘記 その13 ~さらなる条件分枝

この記事は、現在進行系でゼロからプログラミングを勉強している私が、勉強の一環として進展状況をアウトプットする目的で投稿しています。
その為、間違った記述や無駄な作業が結構多めとなっていますが、『それでも良いから一緒に勉強している気になりたい』という方に向けて書いていますので、予め御了承ください。
前回は、if文を追加することによって、入力された数値を元に大きさのカテゴリー分けをするところまで進みました。
今回は、その条件をもう少し細かく設定していきます。
kimniy8.hatenablog.com
前回のカテゴリー分けでは、大きく4つのカテゴリーに分けたわけですが、それでは、いろいろと問題も出てきます。
というのも、前回の分け方では、どんな小さな数値を入力したとしても、『cardboard_a』にカテゴライズされてしまいます。
しかし実際には、作るのが無理な大きさのものも存在します。
例えば、高さや幅が1mmしかないとかね。

という事で今回は、作るのが無理な大きさを指定された場合は、見積自体を断るという条件を設定していきます。
まずは、NG項目を考えていきます。

・高さが100mmを超える、または20mmを下回る
・幅または長さの1辺の長さが70mmを下回る
・必要なボール紙の大きさが、600mm且つ450mm以上の場合
思いつくのはこんな感じなので、この条件に当てはまった場合は、見積価格の場所に『作れません』といった内容のコメントを表示させたい。
ということで取り敢えず、価格表示欄を作るところから始めてみます。

これは、ボール紙の大きさなどを表示させたのと同じ手法で出来そうなので、簡単ですね。
ボタン表示と内訳表示の間ぐらいに、こんな感じで記述します。

# 答え表示
answer = tkinter.Label(text="一箱あたりの価格")
answer.place(x=10, y=80)

準備が整ったので、次に、受付できない条件を書いていこうと思います。『条件』という所から推測出来る通り、これも、if文を使えばできそうですね。
実行のタイミングとしては、前回に書いた、詳細表示やカテゴリー分けよりも前のタイミングでif文が発動しないと駄目なので、それらよりも前に記述します。
関数内に書くため、インデントに注意して書き込んでいきます。

    # 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"] = "申し訳ございませんが、弊社の設備では製造できません"

if以降に、不等号と『or』『and』『not』を使用して、NG項目を設定しています。
『b_hi > 100』というのは、高さが100mmを超えた場合という意味ですね。
それらのNG項目を『or』で繋げています。 『or』は、どれかに当てはまった際は『if』を実行するという事になる為、逆にいえば、どれか1個の条件に当てはまるだけで、NG項目として認識されます。
途中で挟まっている『\』マークは、改行の意味です
プログラムでは、改行そのものに意味が出てくるようで、改行マークを入れなければ一つの文として認識してもらえません。
その為、長くなりそうな場合は『\』マークを入れて、改行しているということをコンピューターに伝えましょう。 

これでNG項目の設定は完了です。後は、NG項目に入っていない場合は関数による計算で処理が続くようにするだけですが、これは簡単で、前回に書いた文の直ぐ上に『else:』と書くだけです。
こうすることで、NG項目に抵触しない場合だけ、前回書いたプログラムが動き始めます。
当然ですが、前回に書いた処理は『else:』の下に入るので、else:以降の文は全部、インデントとして字下げしなければなりません。

複数行をまとめて字下げする場合は、マウスで範囲を指定した状態で『tab key』を押すと出来ます。

良い感じで進んできましたね。
ただ、今の状態では、蓋の高さというものが変更できません。
浅い蓋や深い蓋など、お客さんにとっては選べたほうが便利ですよね。
という事で、その分を追記してみました。

#テキストボックス
box_height_f = tkinter.Entry(width=10, bd=4)
box_height_f.place(x=210, y=80)
# ボール紙の大きさ
b_hi_f = int(box_height_f.get()) # 箱の蓋の高さ

テキストボックス欄に、Entryを追加し、ボール紙の大きさの欄で、Entryから値をとってきています。
ただ、お客さんによっては、『蓋の深さとか決めたくないから、適当に』という方もいらっしゃるかもしれないので、デフォルト値として、『身』の深さの3分の2の高さを入れてみたい。。
という事で、先程の『# 箱の蓋の高さ』の下に、何となくこんな文を追加してみましたが…

    if b_hi_f is "":
        b_hi_f = int(float(b_hi)*0.67)

見事に動かず。
エントリーが空欄の場合に、蓋の高さ(b_hi)の高さに0.67を掛けたものを整数値にして、『b_hi_f』に代入するってイメージで書いたのですが、間違ってたようです。
その後、2日ぐらい考えたのですが全く先に進まないので、この機能は後回しということにしようと思います。

次は、ボール紙の値段を元に、紙の値段を表示させてみようと思いますが、それはまた次回にしようと思います。
kimniy8.hatenablog.com