Tkinterのチェックボタン(Checkbutton)ウィジェットの使い方について解説します。チェックボタン(Checkbutton)は値を持つことができるボタンで、ユーザーが複数の選択肢から複数を選択することができるウィジェットです。
目次
チェックボタン(Checkbutton)の生成
CheckbuttonはTkinterのウィジェットクラスの1つです。Radiobuttonとよく似ていますが、ユーザーが複数の項目を選択することができる点で異なります。
Checkbuttonウィジェットを生成して配置するには他のウィジェット同様次のように記述します。
import tkinter as tk # tk.Frameを継承したApplicationクラスを作成 class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) # ウィンドウの設定 self.master.title("ウィンドウのタイトル") # 実行内容 self.pack() self.create_widget() # create_widgetメソッドを定義 def create_widget(self): # label1ウィジェット self.label1 = tk.Label(self.master, text="興味のある分野を\n選択してください", padx = 50) self.label1.pack() # check1ウィジェット self.fields = ["インフラ","ネットワーク","バックエンド","フロントエンド","デザイン"] # fieldsリストを定義 for field in self.fields: # ループ開始 self.select_var = tk.IntVar() # ウィジェット変数select_varを作成 check1 = tk.Checkbutton(self.master, text=field, variable=self.select_var) # fieldを項目として持つcheck1ウィジェットを生成 check1.pack(anchor=tk.W) # check1ウィジェットを配置 if __name__ == "__main__": root = tk.Tk() app = Application(master=root) app.mainloop()
このように選択肢の横に四角形のチェックボックスが付いたボタンを生成できます。
項目を1つのフレームにまとめる
Checkbuttonの項目を1つのフレームにまとめることでフレーム全体を枠で囲むといったデザインができます。
さらに渡された引数を使ってCheckbuttonを生成するクラスを作れば、Checkbuttonの項目をまとめたフレームを簡単に生成することができるようになります。
import tkinter as tk # tk.Frameを継承したApplicationクラスを作成 class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) # ウィンドウの設定 self.master.title("ウィンドウのタイトル") # 実行内容 self.pack() self.create_widget() # create_widgetメソッドを定義 def create_widget(self): # label1ウィジェットを生成・配置 self.label1 = tk.Label(self.master, text="興味のある分野を選択してください", padx = 50) self.label1.pack() # Checkbarフレームを定義 class Checkbar(tk.Frame): # tk.Frameを継承したCheckbarクラスを作成 def __init__(self, master=None, items=[], side=tk.LEFT, anchor=tk.W): # Checkbarクラスにitems引数を定義 super().__init__(master) for item in items: # ループ開始 self.select_var = tk.IntVar() # ウィジェット変数select_varを作成 self.check = tk.Checkbutton(self, text=item, variable=self.select_var) # itemを項目として持つself.checkウィジェットを生成 self.check.pack(anchor=tk.W, side=tk.LEFT) # self.checkウィジェットを配置 # field_barフレームを生成・配置 self.field_bar = Checkbar(self, items=["インフラ","ネットワーク","バックエンド","フロントエンド","デザイン"]) # items引数に選択肢のリストを渡してfield_barフレームを生成 self.field_bar.pack(side=tk.TOP) # field_barフレームを配置 self.field_bar.config(relief=tk.GROOVE, bd=2) # field_barフレームに縁取りを付ける # product_barフレームを生成・配置 self.product_bar = Checkbar(self, items=["Webアプリ", "スマホアプリ", "デスクトップアプリ"]) # items引数に選択肢のリストを渡してproduct_barフレームを生成 self.product_bar.pack() # product_barフレームを配置 if __name__ == "__main__": root = tk.Tk() app = Application(master=root) app.mainloop()
22行目から30行目でCheckbuttonの項目を1つのフレームにまとめて生成するクラスを定義しています。このクラスはインスタンス生成時に項目リストをitems引数としてを受け取り、それを使って各項目のCheckbuttonウィジェットを生成します。
32行目から35行目と37行目から39行目では上記で定義したクラスに選択項目のリストを渡してCheckbarクラスからフレームを生成・配置しています。
チェックボタン(Checkbutton)を利用した処理
Checkbuttonは押された時にチェックが入りますが、その際に何かしらの処理を追加することもできます。
また値を保持するためチェックされた項目に応じて、別のボタンが押された時にCheckbuttonの値を利用した処理を作ることもできます。
項目が選択された時の処理を追加するにはCheckbuttonを作成する際、command引数に処理内容を渡すよう記述します。
import tkinter as tk # tk.Frameを継承したApplicationクラスを作成 class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) # ウィンドウの設定 self.master.title("ウィンドウのタイトル") # 実行内容 self.pack() self.create_widget() # create_widgetメソッドを定義 def create_widget(self): # label1ウィジェットを生成・配置 self.label1 = tk.Label(self.master, text="興味のある分野を選択してください", padx = 50) self.label1.pack() # Checkbarフレームを定義 class Checkbar(tk.Frame): def __init__(self, master=None, items=[], side=tk.LEFT, anchor=tk.W): super().__init__(master) self.vars = [] # 各項目のチェック状態を保持するvarsリストを定義 for item in items: select_var = tk.IntVar() self.check = tk.Checkbutton(self, text=item, variable=select_var) self.check.pack(anchor=tk.W, side=tk.LEFT) self.vars.append(select_var) # ウィジェット変数select_varをvarsリストに追加 # Checkbarフレームの各項目のチェック状態を返すstate関数を定義 def state(self): return map((lambda select_var: select_var.get()), self.vars) # field_barフレームを生成・配置 self.items1 = ["インフラ", "ネットワーク", "バックエンド", "フロントエンド", "デザイン"] # items1リストを定義 self.field_bar = Checkbar(self, items=self.items1) self.field_bar.pack(side=tk.TOP) self.field_bar.config(relief=tk.GROOVE, bd=2) # product_barフレームを生成・配置 self.items2 = ["Webアプリ", "スマホアプリ", "デスクトップアプリ"] # items2リストを定義 self.product_bar = Checkbar(self, items=self.items2) self.product_bar.pack() # button1ウィジェット def button1_clicked(): # button1をクリックした時の処理 answer1 = [] # answer1リストを定義 for i, state in enumerate(self.field_bar.state()): # ループ開始、field_barフレームの各項目のチェック状態リストを参照 if state == 1: # リストi番目のチェック状態がオンなら answer1.append(self.items1[i]) # items1リストのi番目の項目をanswer1リストに加える answer2 = [] # answer2リストを定義 for i, state in enumerate(self.product_bar.state()): # ループ開始、product_barフレームの各項目のチェック状態リストを参照 if state == 1: # リストi番目のチェック状態がオンなら answer2.append(self.items2[i]) # items2リストのi番目の項目をanswer2リストに加える print(answer1,answer2) # answer1リスト、answer2リストの中身をコンソールに出力 self.button1 = tk.Button(self.master, text="確認", command=button1_clicked, padx=50) # button1ウィジェットを生成 self.button1.pack() # button1ウィジェットを配置 # button2ウィジェット self.button2 = tk.Button(self.master, text="終了", command=root.quit, padx=50) # button2ウィジェットを生成 self.button2.pack() # button2ウィジェットを配置 if __name__ == "__main__": root = tk.Tk() app = Application(master=root) app.mainloop()
このプログラムでは34行目から36行目でCheckbuttonの項目が選択された時の処理を、49行目から64行目ではbutton1がクリックされた時にCheckbuttonで選択されている項目に応じて異なる処理をしています。
つまりこのプログラムはユーザーが「確認」ボタンをクリックすると、その時選択されている項目をfield_barフレームとproduct_barフレームのそれぞれのCheckbuttonごとに分けてリスト化したものをコンソールに表示します。
チェックボタン(Checkbutton)で使えるオプション引数
Checkbuttonウィジェットを生成する際はウィジェットの共通オプションに加えて次のオプションを使用することができます。
属性 | 説明 | 値 |
---|---|---|
command | 項目が選択された時に呼ばれる関数のポインタを指定します | 関数名 |
state | ボタンの状態を指定 | tk.NORMAL(通常) tk.DISABLED(押せないボタン) tk.pressed(押したまま) |
text | 表示する文字列を指定します | 任意の文字列 |
variable | チェックボタンの現在の状態を追跡する制御変数 | ウィジェット変数 |