tk.Chekbuttonの使用方法、2点紹介
- シンプルに1つのチェックボックスを使用
- 複数のチェックボックスを、対象数に合わせて動的(?)に配置
動作とコード
コード
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()
肝となる点
- チェックボックスは「variable=変数」で状態変数とともに生成
- 同変数自体は事前に定義。tk.IntVar()やtk.BooleanVar()を使用(後でvar.get()できる)
- 別途値を取得する関数を作成(ここではshowValue())し、var.get()で値取得
以上のポイント抜粋。
# チェックボックスの状態表示
def show Value():
selection = var.get()
print(selection)
var = tk.BoolVar() # チェックボックスの状態を保持する変数。ここではBoolvar()にした
check_button = tk.Checkbutton(root, text="Select", variable=var) # var を紐づけて生成
その2:動的?に複数配置
- 動的 : 氏名リストの数だけチェックボックス作成し、出欠を取るなどに利用
出力:名前(チェックボックスの表示テキスト)と、チェック状態(Booleanで表示)
コード:
チェックボックス、およびその値を保持するための配列をそれぞれ作成して、そこにchekcbuttonと変数をappend()していけばOK。
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」。
ポイントだけ抜粋するとは以下。
### <チェックボタン生成用の関数を事前定義>
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)