前提・実現したいこと
Tkinterのチェックボックスを複数配置し、チェックボックスを押したときに値(True、False)を取得する関数をつくりたいです。
発生している問題・エラーメッセージ
Tkinterで9×5の配置で、チェックボックスを配置する処理および値を取得する処理はexec関数を用いて、実装しました。
また、チェックボックスの項目は45個あります。
以下は、実装したときのコードです。
Python
1from tkinter import * 2from tkinter import ttk 3 4root = Tk() 5root.title('Checkbutton') 6 7frame1 = ttk.Frame(root, padding=(10)) 8frame1.grid() 9 10# 9 × 5の行列 11for i in range(9): # 行 12 for j in range(5): # 列 13 exec('v{} = BooleanVar()'.format(j+5*i+1)) 14 exec('v{}.set(False)'.format(j+5*i+1)) 15 exec("""cb{} = ttk.Checkbutton( 16 frame1, padding=10, text='test{}', 17 variable=v{}, 18 command=lambda: print('v{} = %s' % v{}.get()))""".format(j+5*i+1, j+i*5+1, j+5*i+1, j+5*i+1, j+5*i+1, j+5*i+1)) 19 exec("cb{}.grid(row={}, column={})".format(j+5*i+1, i, j)) 20 print("cb{}.grid(row={}, column={})".format(j+5*i+1, i, j)) 21 22root.mainloop()
実行すると、以下のような画面が表示され、チェックボックスを押したり押さなかったりすると、v1 = True
,v2 = True
、v3 = False
、v3 = True
が取得できます。
しかし、以下のコードのように関数化すると、取得できなくなります。
Python
1from tkinter import * 2from tkinter import ttk 3 4root = Tk() 5root.title('Checkbutton') 6 7 8def main(): 9 # Frame 10 frame1 = ttk.Frame(root, padding=(10)) 11 frame1.grid() 12 13 # 9 × 5の行列 14 for i in range(9): # 行 15 for j in range(5): # 列 16 exec('v{} = BooleanVar()'.format(j+5*i+1)) 17 exec('v{}.set(False)'.format(j+5*i+1)) 18 exec("""cb{} = ttk.Checkbutton( 19 frame1, padding=10, text='test{}', 20 variable=v{}, 21 command=lambda: print('v{} = %s' % v{}.get()))""".format(j+5*i+1, j+i*5+1, j+5*i+1, j+5*i+1, j+5*i+1, j+5*i+1)) 22 exec("cb{}.grid(row={}, column={})".format(j+5*i+1, i, j)) 23 print("cb{}.grid(row={}, column={})".format(j+5*i+1, i, j)) 24main() 25 26root.mainloop()
関数化すると、例えばtest1のチェックボックスを押したとき、以下のエラーが表示されます。
例 NameError: name 'v1' is not defined
どうすれば、関数化したときに値を取得できるのでしょうか。
追記
本当は、exec関数を使わず、一つ一つ変数を宣言した方がエラーになりにくいと思うのですが、変数の数が多くなるのが嫌なので、exec関数をどうしても使いたいです。
また、関数しなければ、正常に動作はしますが、作成している関数をもとに他の処理に組み込みたいので、関数にする方法があれば教えて頂きたいです。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。