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()