どん底から這い上がるまでの記録

どん底から這い上がりたいけど這い上がれない人がいろいろ書くブログ(主にプログラミング)

RadioButtonを使う

スポンサーリンク


今回はRadioButtonを少し触ってみます。

今回作ったもの ↓↓↓

f:id:pytry3g:20180323153437p:plain

まずRadioButton以外を作ってみます。

import tkinter as tk


class App(tk.Tk):
    def __init__(self):
        super(App, self).__init__()
        self.title("Check Button Example")
        self.geometry("+{}+{}".format(300, 300))
        self.set_widgets()

    def set_widgets(self):
        self.frame = tk.Frame(self, bg="white",
                              width=300, height=300)
        self.frame.pack()
        self.button_radio = tk.Button(self.frame, text="sample", relief="groove")
        self.button_radio.place(x=200, y=150)
        self.button_quit = tk.Button(self.frame, text="quit",
                                     relief="groove", command=self.quit)
        self.button_quit.place(x=200, y=200)

    def run(self):
        self.mainloop()


if __name__ == "__main__":
    app = App()
    app.run()

このプログラムを動かすと、下のウィンドウが立ち上がります。

f:id:pytry3g:20180323160319p:plain

このウィンドウにRadioButtonを配置します。

RadioButtonの作り方は他のwidgetと同じように作ります。

widget = RadioButton(parent, **options)

今回はFrameにRadioButtonを貼り付けるので parentには self.frameを渡します。

optionでtext, value, variableの設定をします。

text - RadioButtonに表示するテキスト

valueRadioButtonに値を設定する。ほかのRadioButtonの値と重複してはいけない。

variable - 変数の設定。

 

上のプログラムの set_widgetsメソッドに以下を追加します。

        ### Ratio Button ###
        self.radio_var = tk.IntVar()
        self.radio_var.set(1)
        self.radio_o = tk.Radiobutton(self.frame, text="o", value=1,
                                      variable=self.radio_var)
        self.radio_x = tk.Radiobutton(self.frame, text="x", value=0,
                                      variable=self.radio_var)

ここでやってることは、まず VariableクラスのIntVarを用意します。

tkinterのVariableクラスを使うと値を新しく設定することができたり、値が変わったら特定の関数を呼び出すことができます。

IntVarを使う理由はどのRadioButtonが選択されているのかを知るためです。

今回2つのRadioButtonを作っていますが、それぞれoptionのvalueで1と0を設定しています。self.radio_varにはvalueの値が入るようになります。例えば、oが選択されていると self.radio_varには1が、xが選択されていると0がセットされるようになります。

self.button_radioが押されたらself.radio_varの値を取得するように、上のプログラムを以下のように変えます。ボタンが押されたらself.get_radioが呼ばれるようにしました。

        # self.button_radio = tk.Button(self.frame, text="sample", relief="groove")
        self.button_radio = tk.Button(self.frame, text="sample",
                                      relief="groove", command=self.get_radio)

self.get_radioの中身です。

    def get_radio(self):
        print(self.radio_var.get())

これで、どのRadioButtonが選択されているのかを判別できるようになります。

全体のソース

import tkinter as tk


class App(tk.Tk):
    def __init__(self):
        super(App, self).__init__()
        self.title("Check Button Example")
        self.geometry("+{}+{}".format(300, 300))
        self.set_widgets()

    def set_widgets(self):
        self.frame = tk.Frame(self, bg="white",
                              width=300, height=300)
        self.frame.pack()
        self.button_radio = tk.Button(self.frame, text="sample",
                                      relief="groove", command=self.get_radio)
        self.button_radio.place(x=200, y=150)
        self.button_quit = tk.Button(self.frame, text="quit",
                                     relief="groove", command=self.quit)
        self.button_quit.place(x=200, y=200)
        ### Ratio Button ###
        self.radio_var = tk.IntVar()
        self.radio_var.set(1)
        self.radio_o = tk.Radiobutton(self.frame, text="o", value=1,
                                      variable=self.radio_var)
        self.radio_x = tk.Radiobutton(self.frame, text="x", value=0,
                                      variable=self.radio_var)
        self.radio_o.place(x=100, y=100)
        self.radio_x.place(x=100, y=120)

    def get_radio(self):
        print(self.radio_var.get())

    def run(self):
        self.mainloop()


if __name__ == "__main__":
    app = App()
    app.run()