0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

tkinter checkbox

Last updated at Posted at 2025-02-25

tk.Chekbuttonの使用方法、2点紹介

  1. シンプルに1つのチェックボックスを使用
  2. 複数のチェックボックスを、対象数に合わせて動的(?)に配置

動作とコード

ボタンクリックでチェックボックスの状態表示
{254E9199-ABE1-4CD2-8E5F-2F9AA87AF99D}.png

コード

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:動的?に複数配置

  • 動的  : 氏名リストの数だけチェックボックス作成し、出欠を取るなどに利用

{FE799604-212C-451D-91B6-18FBF3B730A2}.png

出力:名前(チェックボックスの表示テキスト)と、チェック状態(Booleanで表示)

{DAB979E6-F63F-4549-86F8-CF1BD6539713}.png

コード:
チェックボックス、およびその値を保持するための配列をそれぞれ作成して、そこに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)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?