だぶるばいせっぷす 新館

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

【プログラミング】 python奮闘記 その15 ~Radiobutton導入

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

前回は、フレームを利用してレイアウトを簡単にする事に挑戦してみました。
次は、ラジオボタンという機能を実装していきたいと思います。

その前に、改めて『ラジオボタン』を実装したい理由を書いておくと、ラジオボタンというのは、複数の選択肢の中から1つだけを選択できるという道具です。
つの丸があって、どれか一つをマウスでクリックして選択する事が出来るという、『あれ』ですね。
似たようなものにチェックボックスというのもありますが、こちらは複数回答が可能な為、今回のものには使いにくい。
前に使ったボタン(Button)を使っても良いのですが、これを作るぐらいならラジオボタンを導入したほうが楽そうということで、ラジオボタンにしました。

導入方法は簡単で、tkinterにRadiobuttonというのがあるので、それを利用して作ります。
ここで重要なのが、最初に値を取るための変数を定義して置かなければならないとう事です。
というのもRadiobuttnは、この変数によってグループを見分けている為、これを設定しておかないと、複数のRadiobuttonを設置できないんですね。

という事で早速、変数を作っていこうと思います。

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)

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)

スペースの関係で、蓋と身の『紙【a】【b】』しか書いてませんが、実際にはa~dまで書いてます。
『radio1_val』と『radio2_val』という2つの変数を作って、tkinterの数値(int)の値(val)を代入しています。
そして、それぞれの初期値として、『0』をセットしています。

次に、paper_a b…といった感じでラジオボタンの変数を作り、tkinterのRadiobuttonを代入しています。
Radiobuttonの引数として、『表示させるフレーム』『ボタンに表示させる名前(text)』『ラジオボタンのグループ名(variable)』『ボタンが押されたときに取得する値』を入れていきます。
この他にもオプションが有るようですが、今回は使わないので書きません。 気になる人は調べてみてください。
注意点としては、frame5と6のラジオボタンの引数『variable』の値が変わっているというところです。
ここを変えずに同じ値を設定してしまうと、同じ『value』値のボタンが連動して反応してしまいます。
今回は端折って紙【a】【b】しか書いていないので、『value』値は0と1だけですが、本来はa~dまであるので、value値も0~3になります。

これで、ラジオボタンの設置が完了しました。
後は、ラジオボタンが押された際の値を取得して、それを計算結果に反映させるだけです。
という事で早速、関数内にラジオボタンの値を取得する為の変数を書きます。

    # ラジオボタンの値取得
    radio1 = radio1_val.get()
    radio2 = radio2_val.get()

前に『Entry』からget()で値を取り出したときは、整数値として取り扱うためにint()でくくりましたが、今回は、radio1_valの値は『tkinter.IntVar()』によって整数値として取り扱うと指定しているので、int()と書く必要はありません。

これで、ユーザーの選択がラジオボタンによって取得できる。
後はプログラムとしては、そのユーザーの選択を計算式に組み込んで、結果として反映するだけ。
これは、if文を使うことで可能な為、関数内のボール紙のカテゴリーわけをしている部分に、更にif文を追加して、書いていくだけ。

ただ、今までと同じように書いていくと、ものすごく長くなりますよね…
というのも、今までのif文はこんな感じで書いていましたから

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

このif文の下に、更に4行のif文、を書いていくのはかなり疲れる…

    # 身のボール紙の価格
    if cardboard_a:
        cardboard_price["text"] = "ボール紙の価格" + str(40) + "円"
        if radio1 == 0:
        処理1…       
        elif radio1 == 1:
    処理2…

というか、この方式の場合、何らかの理由で単価を変えなければならない場合は、全部の箇所を訂正しなければならない。
プログラムって、自分でやることが面倒くさいことを変わりにコンピューターにやらせることなのに、その訂正作業で同じことをやらされるのって、なんか違う気がします。。
という事で、この単価の部分を書き直そうと思いますが、それはまた次回に。