tkinter checkbox

# tk.Chekbuttonの使用方法、2点紹介
1. シンプルに1つのチェックボックスを使用
1. 複数のチェックボックスを、対象数に合わせて動的（？）に配置

# <font color="Red">動作とコード</font>

ボタンクリックでチェックボックスの状態表示
![{254E9199-ABE1-4CD2-8E5F-2F9AA87AF99D}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800268/95a22662-5d37-42ae-8f7e-9804808b4bea.png)

コード
```python
import tkinter as tk

# CheckBoxのチェック状態を表示する（コンソール出力）
def showValue():
    selection = var.get()
    print(f"チェックボックスの値は: {selection}")

# mainのWindowを表示
root = tk.Tk()
root.title("Check Button")

var = tk.IntVar()  # チェックボックスの状態を保持する変数

check_button = tk.Checkbutton(root, text="Select", variable=var)    # checkで値=1、uncheckで値=0
check_button.pack() #表示。どこに配置するかは別途packのオプション引数で指示

# 動作用にボタンを配置。クリックで選択状態を表示
button = tk.Button(root, text="値を取得", command=showValue)
button.pack()

# mainloop()
root.mainloop()
```

# <font color="Red">肝となる点</font>
- チェックボックスは「variable=変数」で状態変数とともに生成
- 同変数自体は事前に定義。tk.IntVar()やtk.BooleanVar()を使用（後でvar.get()できる）
- 別途値を取得する関数を作成（ここではshowValue()）し、var.get()で値取得

以上のポイント抜粋。
```python
# チェックボックスの状態表示
def show Value():
    selection = var.get()
    print(selection)
var = tk.BoolVar()  # チェックボックスの状態を保持する変数。ここではBoolvar()にした
check_button = tk.Checkbutton(root, text="Select", variable=var)    # var を紐づけて生成
```

# <font color="Red">その２：動的？に複数配置</font>
- 動的 　：　氏名リストの数だけチェックボックス作成し、出欠を取るなどに利用

![{FE799604-212C-451D-91B6-18FBF3B730A2}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800268/c1d2d1a4-f6b5-465b-81a6-b394de033f9c.png)

出力：名前（チェックボックスの表示テキスト）と、チェック状態（Booleanで表示）

![{DAB979E6-F63F-4549-86F8-CF1BD6539713}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800268/107ed3fc-d196-44fa-b557-c782e8f56afd.png)

コード：
チェックボックス、およびその値を保持するための配列をそれぞれ作成して、そこにchekcbuttonと変数をappend()していけばOK。

```python
import tkinter as tk

### <チェックボタン生成用の関数を事前定義>
def createMultiCheckButton(baseFrame, nameList, checkBoxes, checkBoxVars):
    for i, name in enumerate(nameList):
        checkBoxVars.append(tk.BooleanVar())
        checkBoxVars[i].set(False)  # 初期値を明示的にuncheckにしておく
        checkBoxes.append(tk.Checkbutton(baseFrame, text=name, variable=checkBoxVars[i]))
        checkBoxes[i].pack(anchor=tk.W,pady=10)
    root.update()   # 描画の更新
    baseFrame.configure(height=checkBoxes[i].winfo_y()+checkBoxes[i].winfo_height()+20)   # baseFrameの大きさ調整　winfo_height()+20 : pady=20 equivalent


def showValue():
    selections = []
    for var, name in zip(checkBoxVars, checkBoxes):
        selections.append(f"name : {name.cget("text")}, check?:{var.get()}")
    print(f"チェックボックスの値（出欠確認等に利用可能） \n{selections}")
### </関数を事前定義>


### mainのWindowを定義、記述
root = tk.Tk()
root.title("Check Button")

# CheckBox配置用にframeを作成（任意）
baseFrame = tk.Frame(root, relief='raised', borderwidth=2)  # frameの表示を強調
baseFrame.pack(fill=tk.X)

# 値保持用の配列を定義
checkBoxes = []
checkBoxVars= []

nameList = ["Aris", "Bob", "Carroll", "David"]
# checkBox作成関数を呼び出して描画
createMultiCheckButton(baseFrame, nameList, checkBoxes, checkBoxVars)


# 動作用にボタンを配置。クリックで選択状態を表示
button = tk.Button(root, text="値を取得", command=showValue)
button.pack()

# mainloop()
root.mainloop()

```

frameを定義しているので見通しが悪くなっているが、
本質は「関数を事前定義」で2か所定義している「def」。

ポイントだけ抜粋するとは以下。

```python
### <チェックボタン生成用の関数を事前定義>
def createMultiCheckButton(baseFrame, nameList, checkBoxes, checkBoxVars):
    for i, name in enumerate(nameList):
        checkBoxVars.append(tk.BooleanVar())
        checkBoxVars[i].set(False)  # 初期値を明示的にuncheckにしておく
        checkBoxes.append(tk.Checkbutton(baseFrame, text=name, variable=checkBoxVars[i]))
        checkBoxes[i].pack(anchor=tk.W,pady=10)
    root.update()   # 描画の更新
    baseFrame.configure(height=checkBoxes[i].winfo_y()+checkBoxes[i].winfo_height()+20)   # baseFrameの大きさ調整　winfo_height()+20 : pady=20 equivalent

...

# 値保持用の配列を定義
checkBoxes = []
checkBoxVars= []

nameList = ["Aris", "Bob", "Carroll", "David"]
# checkBox作成関数を呼び出して描画
createMultiCheckButton(baseFrame, nameList, checkBoxes, checkBoxVars)
```