だぶるばいせっぷす 新館

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

【プログラミング】 python奮闘記 その14 ~フレームでまとめる

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

前回までで、ユーザーの入力値を元にボール紙の大きさを計算し、それを元に価格を割り出すというところまで書きました。
次は、ボール紙の種類をベースに、追加で紙の種類を指定して、紙の値段を算出していこうと思います。
紙の種類は値段によって4種類に分けてあり、ボール紙の大きさが4種類なので、合計、16種類の値段があることになります。

カテゴリーが4つで、大きさはボール紙の大きさを流用するという事で、ユーザーには4種類の紙のカテゴリーを選択してもらう事で、価格が出るようにしたいと思います。
『4つの中から1つを選ぶ』というのは、tkinterの中のRadiobuttonというウィジェットを使う事でできそうなので、それを使っていこうと思いうのですが…

ここで、一つ問題が。
追加するウィジェットが多くなってきて、いちいち『place』でx,yを指定してられなくなってきました。
というのも、この方式で一つ一つ指定していくと、既にあるウィジェットの間に別のウィジェットを挿入しようと思うと、それより下の位置を全て修正しなければなりません。
そんな面倒くさいことはしたくないので、もっと簡単に配置する方法を考えていきます。

ウィジェットに対して位置を指定しておく方法は、実は『place』だけではなく、その他にも2つ存在します。
それが、『pack』と『grid』です。
『pack』は、何も指定しない状態で『()』として置くと、一番上の真ん中に表示されます。
複数のウィジェットを指定なしで『pack()』で置くと、プログラム上で一番上で指定したものが中央そろえで上に表示され、次のものはその下に配置されていきます。
ただ、引数として(side=LEFT)って感じで指定すると、左詰めて順番に横方向に並べていきます。
この他にも引数として指定できるものは沢山あるようですが、これだけわかれば大丈夫でしょう。気になる人は、自分で調べてみてください。

もう一つの『grid』は、ウィジェット表計算ソフトのように規則正しく並べてくれる。
引数として『column』(x軸方向)と『row』(y軸方向)を設定する事で、置く場所を指定することが出来ます。
例えば、grid(column=1,row=5, padx=5)って書くと、2列目の6行目という感じで置いてくれる(数字は1からではなく0から始まるから)
この2つを利用すると、今までのようにx,yを指定しなくても適当に配置するだけで自動で調整してくれるのでかなり便利。

ただ、この2つだけでは、自分が思い描いたとおりの配置は難しい…
という事で、別の機能をもう一つ使うことにします。それが、『Frame』です。
『Frame』は、境界線のようなもので、このフレイムを表示カテゴリーの数だけ作ってまとめておけば、レイアウトがより簡単に調整できるようになります。
例えるなら、『Frame』自体は空箱のようなもので、そこに、4つある入力欄をまとめて入れておく。
そして、プログラム上で『Frame』を配置すれば、好きな場所に入力欄をまとめたものを配置できる。

これを、さっきの『pack』や『grid』と組み合わせることで、自分の好きなレイアウトを簡単に実現することが出来て、その上、配置換えの手間も楽になります。
という事で早速、『Frame』を作っていきましょう。

現段階では、『見出し部分』『入力欄』『見積価格』『詳細内訳』があり、これに加えて『ラジオボタン』を追加したいので、フレームを5個作ります。
作り方は簡単で、こんな感じで記述します。

frame1 = tkinter.Frame(root)

分かりやすいように、変数に『frame1』として、tkinterのFrameを呼び出し、引数に(root)を当てます。
引数の『root』は、メインとなるWindowの名前でしたよね。そのWindow上にフレームを配置するという意味で、引数を当てています。
これを1~5まで作ります。

各場所は、分かりやすいように、それぞれのフレームに入れる要素の一番上に書いておけばいいと思います。
フレームを作ったら、それぞれのウィジェットをフレームに入れていくわけですが、入れ方というのは、それぞれのウィジェットの引数に、入れたいフレームの変数を入れるだけです。
例えばこんな感じ。

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

ウィジェットの引数は、『表示させる場所』の受付を行っているので、その場所にそのまま書き込むだけです。
ちなみに何も書かなければ、『root』に表示されます。 デフォルト値としてメインウィンドウが指定してあるんでしょうね。

このフレームですが、フレーム自体もプログラムで位置を指定して設置するという指示をしないと、設置されません。
その為、画面表示の最後の方に、このように記述して配置を行います。

# Frame配置
frame1.pack()
frame3.pack()
frame2.pack()
frame5.pack()
frame4.pack()

1~6のフレームを作ったからと言って、1から順番に並べなければならないということはありません。
好きな順番で並べても大丈夫です。
今回は試していませんが、Frameの中にFrameを入れることも可能でしょうから、フレーム配置が多くなって配置が面倒になる場合などは、更に大きなFrameで括って整理するのも良いかもしれません。

という事で今回は、ウィジェットの位置を指定して配置する『pack』『grid』『Frame』について書いていきました。
次回は、ラジオボタンの設置について書いていこうと思います。
kimniy8.hatenablog.com