だぶるばいせっぷす 新館

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

【プログラミング】 python奮闘記 その10 ~記入欄を作る

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

前回は、ウィンドウを作成したところまで書きました。
kimniy8.hatenablog.com

今回からは、このウィンドウに色々と部品であるウィジェットを貼り付けていきます。
まず、右上の分かりやすい部分に『お見積り』と表示させたいと思います。
画面に文字を表示させるためには、お馴染み『tkinter』の『Label』を使います。
この『Label』は、ものにラベルを貼り付けるように、渡した引数を指定の場所に貼り付けてくれる便利な奴です。

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

英語で見出しのことを『heading』というらしいので、変数名は『heading』とし、そこに、引数に(text="お見積り")を渡したtkinterのLabelを代入しています。
tkinterのLabelが代入された『heading』の位置『place』として、x,yともに10ピクセルを指定しています。

次に必要になるのが、ユーザーが箱の寸法を入力することが出来る、テキストボックスの導入です。
テキストボックスの導入は、『tkinter』の『Entry』で可能になります。
箱には、『幅』と『長さ』と『高さ』がある為、数値を打ち込めるスペースは3つ必要です。早速書いていきましょう。

# テキストボックス表示
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)

f:id:kimniy8:20180604224500j:plain
変数名には、それぞれ『box_』の後に『幅』『長さ』『高さ』を表す英単語を付けています。
テキストボックスを表示してくれる『Entry』には、テキストボックスの長さと装飾具合を引数として渡してあります。
この数値を変えてみると、どうなるのでしょうか?
変数『box_width』に代入している『Entry』の引数を変えてみましょう。

box_width = tkinter.Entry(width=5, bd=20)
box_width.place(x=10, y=40)

こうすると…
f:id:kimniy8:20180604224403j:plain
テキストボックスの長さが半分になって、縁取りの部分が凄いことになりました。『bd』の部分は縁取りの装飾度合いのようです。
大きくするほどにデカくなっていくっぽいですね。

入力欄も出来たことですし、この入力を元に、材料費を算出していこうと思います。
材料費を計算するのに、まず必要なのが、材料をどのぐらい使うのかということですよね。
紙箱のベースとなるボール紙を製紙会社から買う場合は、大きさが決まっていますので、それを何分割出来るのかによって、材料の単価が決まってきます。

今回の簡易見積りでは、細かい計算はせずに、このボール紙を2分割・4分割・6分割・12分割の4つのカテゴリーに分けて、原価に手間賃をプラスした値を材料費とします。
4つのカテゴリーと手間賃を加えた材料費を表にすると、こんな感じ。
f:id:kimniy8:20180604224543j:plain
カテゴリー分けが出来たので、次に、入力された数値を、原材料であるボール紙の大きさに変換しようと思います。
どうやれば、原材料の数字が出てくるのかというと、単純な箱の展開図を思い描いてもらえれば分かりますが、『幅+高さx2』『長さ+高さx2』で出せます。
f:id:kimniy8:20180604224607j:plain
計算式が分かったので、早速、入力欄に打ち込まれた数値を取り出して、計算式を関数に組み込んでみようともいます。
という事で早速、関数の定義です。関数名ですが、見積もりボタンを押した際に発動する予定なので、質問という意味の英単語『ask』とクリックをあわせて、『ask_click』にしておきます。

# ボール紙の大きさ
def ask_click():
    b_hi = box_height.get() # 箱の高さ
    b_wid = box_width.get() # 箱の幅
    b_long = box_length.get() # 箱の長さ

特定の場所から値を取り出すには、get関数を使うと取り出せます。
記入欄の名前は、記入欄の要素を代入した変数なので、その変数に『の』という意味の『.』を付けて、『get()』とし、それを、新たな変数である『b_hi』などに代入しています。
getの隣の『()』は、引数無しで関数を実行するという意味合いのカッコです。

これで、計算の元となる『幅』『長さ』『高さ』の数値が関数内の『b_hi』などの変数に代入できました。
後は、この変数を計算式に組み込む事で、ボール紙の大きさが出せそうです。

    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 # ボール紙の蓋の横

『b_tate』という変数に、ボール紙の縦の長さである『箱の長さ+箱の高さ*2』を代入。『b_yoko』にも同様に、ボール紙の横の長さを代入しています。
下の二行は、蓋の場合です。 蓋の方が大きくないと、蓋が閉じられませんから、『+5』と長さを足しています。

これで、入欄から値を取り出して、目的の値に加工することが出来ました。
ちなみにこの関数ですが、発動条件を設定していないので、このままだと動きませんし、正常に動いているかどうかも解らない状態だったりしますがけども。
一応、ネタバレしておくと、この記述では思ったようには動きませんが、次回は、そのあたりの事も扱っていこうと思います。

今回までのプログラムで書いた、コードのまとめはこちら。

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=10)
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)

# ボール紙の大きさ
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 # ボール紙の蓋の横

# メインループ
root.mainloop()