Checkbuttonとは
項目に対するYes/Noをチェックするボタンです。
チェックボタンの実装は以下になります。 ①押されたとき処理したい ②実行ボタンが押されたときまとめて処理したい ボタンが押されたとき処理はボタンの値は使いません。チェックボタンではチェックの値を取得して保存することがボタンと違います。チェックボタンは以下のように作成します。
cb1Name = 'Java'
chkVal1 = tk.BooleanVar()
chkVal1.set(False) # 初期化
cb1 = tk.Checkbutton(
root,
text= cb1Name,
variable=chkVal1,
command=lambda:exec_click(cb1Name, chkVal1.get()))
cb1.grid(row = 0,column = 0)
cb2Name = 'Python'
chkVal2 = tk.BooleanVar()
chkVal2.set(False) # 初期化
cb2 = tk.Checkbutton(
root,
text= cb2Name,
variable=chkVal2,
command=lambda:exec_click(cb2Name, chkVal2.get()))
cb2rid(row = 1, column = 0)
チェックされているかのデータは
variable=chkVal1 にセットします。 コールバック関数は、 command=lambda:exec_click(cb2Name,
chkVal2.get())
と記述します。コールバック関数は引数があると直接指定できません。 無名関数(lambda )をセットします。無名関数がexec_clickをよびだします。これで引数をexec_clickに渡すことができます。
ここで問題点。チェックボタンひとつに9行使っています。チェックボタンが多くなったら冗長なコードになってしまます。改善しました。
# -*- coding: utf-8 -*-
import sys
import tkinter as tk
from tkinter import messagebox
checkValue = {}
checkButtons = {}
#ボタンをクリックしたときのイベントハンドラー
def exec_click(btnName, checked):
chk = None
if (checked == True):
chk = 'checked'
else:
chk = 'unchecked'
print(btnName + '---' + chk)
# messagebox.showinfo("発生したイベント",btnName + '---' + chk)
def btn_on():
global checkValue
for i in range(len(checkValue)):
cb = checkValue[i]
# check = cb.Get()
print(cb.get())
def setCommand(cb, title, checked):
cb.configure(command=lambda:exec_click(title, checked.get()))
def main():
global checkValue, checkButtons
root = tk.Tk()
root.title("Button's app")
root.geometry("200x150")
cbTiles =[
'Java',
'Python',
'C++',
'VB',
]
cbSize = len(cbTiles)
for i in range(cbSize):
bl = tk.BooleanVar()
bl.set(False)
checkValue[i] = bl
checkButtons[i] = tk.Checkbutton(root, text= cbTiles[i],
variable=checkValue[i])
setCommand(checkButtons[i], cbTiles[i], checkValue[i])
checkButtons[i].grid(row = i,column = 0, padx=0,pady=0,ipadx=0,ipady=0)
button = tk.Button(
root,
bg='pink',
text='実行',
activebackground= 'pink',
command=btn_on)
button.grid(row = cbSize, column = 0)
root.mainloop()
if __name__ == "__main__":
main()
setCommandでcommand=をセットしています。これはtk.Checkbutton()内でやるとどれをチェックしてもVBをクリックしたことになったためです。このように記述すればチェックボタンが多くなっても平気です。
|
あん