質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

1回答

1824閲覧

[Python3] tkinter, for文の使用方法

3265462164

総合スコア67

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

2クリップ

投稿2019/09/20 04:35

チェックボタンのステータスを抜き出すために論理演算で一つずつコードを書いておりますが、
今後チェックボタンを増やすにあたり、このままだと膨大な量のコードになることが想定されます。
リストを作成し、for文で記述すれば良いみたいなところまでは調べたのですが、
記述方法の検討がつきません。

記述方法ご存知の方いらしたら、教えていただけないでしょうか。

やりたいことは、# 論理演算 で記述している個所をもうすこしまとめたいです。

初心者のため非常に見づらいコードですが、よろしくお願いします。

python

1from tkinter import * 2from tkinter import ttk 3 4root = Tk() 5root.title('人口') 6root.geometry("500x450+640+40") 7 8 9frame1 = ttk.Labelframe(root, text='地域選択', padding=5) 10frame1.grid(row=0, column=0, columnspan=1, padx=15, pady=10, sticky='w') 11 12frame2 = ttk.Labelframe(root, text='関東',padding=5) 13frame2.grid(row=1,column=0, columnspan=1, padx=15, pady=10, sticky='nw') 14 15frame3 = ttk.Labelframe(root, text='関西',padding=5) 16frame3.grid(row=1,column=1, columnspan=1, padx=10, pady=10, sticky='nw') 17 18 19selected_frame = IntVar() 20 21def change_selected_frame(): 22 if selected_frame.get() == 0: 23 24 for child in frame2.winfo_children(): 25 child.configure(state='enable') 26 for child in frame3.winfo_children(): 27 child.configure(state='disable') 28 29 elif selected_frame.get() == 1: 30 for child in frame2.winfo_children(): 31 child.configure(state='disable') 32 for child in frame3.winfo_children(): 33 child.configure(state='enable') 34 35 else: 36 for child in frame2.winfo_children(): 37 child.configure(state='disable') 38 for child in frame3.winfo_children(): 39 child.configure(state='disable') 40 41 42rb1 = ttk.Radiobutton(frame1, text='関東 ', 43 variable=selected_frame, 44 value=0, 45 command=change_selected_frame) 46rb1.grid(row=1,column=0,pady=5) 47 48rb2 = ttk.Radiobutton(frame1, 49 text='関西', 50 variable=selected_frame, 51 value=1, 52 command=change_selected_frame) 53rb2.grid(row=1,column=1,pady=5) 54 55 56# 関東の全てのチェックボックスをONにする関数 57def check_all_kanto_checkboxes(): 58 val1.set(True) 59 val2.set(True) 60 val3.set(True) 61 val4.set(True) 62 63# 関東の全てのチェックボックスをOFFにする関数 64def clear_all_kanto_checkboxes(): 65 val1.set(False) 66 val2.set(False) 67 val3.set(False) 68 val4.set(False) 69 70# 関西の全てのチェックボックスをONにする関数 71def check_all_kansai_checkboxes(): 72 val5.set(True) 73 val6.set(True) 74 val7.set(True) 75 76# 関西の全てのチェックボックスをOFFにする関数 77def clear_all_kansai_checkboxes(): 78 val5.set(False) 79 val6.set(False) 80 val7.set(False) 81 82 83# 論理演算 84def check_box(): 85 if val1.get() and val2.get() and val3.get() and val4.get(): 86 print("東京 & 神奈川 & 千葉 & 埼玉") 87 elif val1.get() and val2.get() and val3.get(): 88 print("東京 & 神奈川 & 千葉") 89 elif val1.get() and val2.get() and val4.get(): 90 print("東京 & 神奈川 & 埼玉") 91 elif val1.get() and val3.get() and val4.get(): 92 print("東京 & 千葉 & 埼玉") 93 elif val2.get() and val3.get() and val4.get(): 94 print("神奈川 & 千葉 & 埼玉") 95 elif val1.get() and val2.get(): 96 print("東京 & 神奈川") 97 elif val1.get() and val3.get(): 98 print("東京 & 千葉") 99 elif val1.get() and val4.get(): 100 print("東京 & 埼玉") 101 elif val2.get() and val3.get(): 102 print("神奈川 & 千葉") 103 elif val2.get() and val4.get(): 104 print("神奈川 & 埼玉") 105 elif val3.get() and val4.get(): 106 print("千葉 & 埼玉") 107 elif val1.get(): 108 print("東京") 109 elif val2.get(): 110 print("神奈川") 111 elif val3.get(): 112 print("千葉") 113 elif val4.get(): 114 print("埼玉") 115 elif val5.get() and val6.get() and val7.get(): 116 print("大阪 & 兵庫 & 京都") 117 elif val5.get() and val6.get(): 118 print("大阪 & 兵庫") 119 elif val5.get() and val7.get(): 120 print("大阪 & 京都") 121 elif val6.get() and val7.get(): 122 print("兵庫 & 京都") 123 elif val5.get(): 124 print("大阪") 125 elif val6.get(): 126 print("兵庫") 127 elif val7.get(): 128 print("京都") 129 130 131btn1 = ttk.Button(frame2, text='全選択', padding=5, command=check_all_kanto_checkboxes) 132btn1.grid(row=5,column=0,pady=5) 133 134btn2 = ttk.Button(frame2, text='全解除', padding=5, command=clear_all_kanto_checkboxes) 135btn2.grid(row=5,column=1,pady=5) 136 137btn3 = ttk.Button(frame3, text='全選択', padding=5, command=check_all_kansai_checkboxes) 138btn3.grid(row=5,column=0,pady=5) 139 140btn4 = ttk.Button(frame3, text='全解除', padding=5, command=clear_all_kansai_checkboxes) 141btn4.grid(row=5,column=1,pady=5) 142 143btn5 = ttk.Button(text='集計', padding=5, command=check_box) 144btn5.grid(row=5,column=0,pady=5) 145 146btn6 = ttk.Button(text='キャンセル', padding=5) 147btn6.grid(row=5,column=1,pady=5) 148 149 150val1 = BooleanVar() 151val1.set(False) 152 153val2 = BooleanVar() 154val2.set(False) 155 156val3 = BooleanVar() 157val3.set(False) 158 159val3 = BooleanVar() 160val3.set(False) 161 162val4 = BooleanVar() 163val4.set(False) 164 165val5 = BooleanVar() 166val5.set(False) 167 168val6 = BooleanVar() 169val6.set(False) 170 171val7 = BooleanVar() 172val7.set(False) 173 174kt1 = ttk.Checkbutton(frame2, text='東京', variable=val1) 175kt1.grid(row=6,column=0, columnspan=1, padx=15, pady=5, sticky='w') 176 177kt2 = ttk.Checkbutton(frame2, text='神奈川', variable=val2) 178kt2.grid(row=7,column=0, columnspan=1, padx=15, pady=5, sticky='w') 179 180kt3 = ttk.Checkbutton(frame2, text='千葉', variable=val3) 181kt3.grid(row=8,column=0, columnspan=1, padx=15, pady=5, sticky='w') 182 183kt4 = ttk.Checkbutton(frame2, text='埼玉', variable=val4) 184kt4.grid(row=9,column=0, columnspan=1, padx=15, pady=5, sticky='w') 185 186 187ks1 = ttk.Checkbutton(frame3, text='大阪', variable=val5) 188ks1.grid(row=6,column=0, columnspan=1, padx=15, pady=5, sticky='w') 189 190ks2 = ttk.Checkbutton(frame3, text='兵庫', variable=val6) 191ks2.grid(row=7,column=0, columnspan=1, padx=15, pady=5, sticky='w') 192 193ks3 = ttk.Checkbutton(frame3, text='京都', variable=val7) 194ks3.grid(row=8,column=0, columnspan=1, padx=15, pady=5, sticky='w') 195 196 197selected_frame.set(-1) 198change_selected_frame() 199 200root.mainloop()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

下記コードのように、チェックボックスに関する情報をクラス化しまとめて管理すると、コードを短くできます。

from tkinter import * from tkinter import ttk root = Tk() root.title('人口') root.geometry("500x450+640+40") frame1 = ttk.Labelframe(root, text='地域選択', padding=5) frame1.grid(row=0, column=0, columnspan=1, padx=15, pady=10, sticky='w') frame2 = ttk.Labelframe(root, text='関東',padding=5) frame2.grid(row=1,column=0, columnspan=1, padx=15, pady=10, sticky='nw') frame3 = ttk.Labelframe(root, text='関西',padding=5) frame3.grid(row=1,column=1, columnspan=1, padx=10, pady=10, sticky='nw') selected_frame = IntVar() def change_selected_frame(): if selected_frame.get() == 0: for child in frame2.winfo_children(): child.configure(state='enable') for child in frame3.winfo_children(): child.configure(state='disable') elif selected_frame.get() == 1: for child in frame2.winfo_children(): child.configure(state='disable') for child in frame3.winfo_children(): child.configure(state='enable') else: for child in frame2.winfo_children(): child.configure(state='disable') for child in frame3.winfo_children(): child.configure(state='disable') rb1 = ttk.Radiobutton(frame1, text='関東', variable=selected_frame, value=0, command=change_selected_frame) rb1.grid(row=1,column=0,pady=5) rb2 = ttk.Radiobutton(frame1, text='関西', variable=selected_frame, value=1, command=change_selected_frame) rb2.grid(row=1,column=1,pady=5) #チェックボックスに関する情報をクラス化し、まとめて管理 #関東 class val_kt: def __init__(self,name,set_frame,row_no): self.bool=BooleanVar()#チェックの有無 self.bool.set(False)#チェック情報を初期化 self.name=name#都道府県名 self.Cbtn=ttk.Checkbutton(set_frame, text=self.name, variable=self.bool)#チェックボックス self.Cbtn.grid(row=row_no,column=0, columnspan=1, padx=15, pady=5, sticky='w') #関西 class val_ks: def __init__(self,name,set_frame,row_no): self.bool=BooleanVar() self.bool.set(False) self.name=name self.Cbtn=ttk.Checkbutton(set_frame, text=self.name, variable=self.bool) self.Cbtn.grid(row=row_no,column=0, columnspan=1, padx=15, pady=5, sticky='w') #関東についての情報を設定 val_kt1=val_kt('東京',frame2,6) val_kt2=val_kt('神奈川',frame2,7) val_kt3=val_kt('千葉',frame2,8) val_kt4=val_kt('埼玉',frame2,9) #関東についての情報をリスト化 val_kt_list=[val_kt1,val_kt2,val_kt3,val_kt4] #関西 val_ks1=val_ks('大阪',frame3,6) val_ks2=val_ks('兵庫',frame3,7) val_ks3=val_ks('京都',frame3,8) val_ks_list=[val_ks1,val_ks2,val_ks3] # 関東の全てのチェックボックスをONにする関数 def check_all_kanto_checkboxes(): for val in val_kt_list: val.bool.set(True) # 関東の全てのチェックボックスをOFFにする関数 def clear_all_kanto_checkboxes(): for val in val_kt_list: val.bool.set(False) # 関西の全てのチェックボックスをONにする関数 def check_all_kansai_checkboxes(): for val in val_ks_list: val.bool.set(True) # 関西の全てのチェックボックスをOFFにする関数 def clear_all_kansai_checkboxes(): for val in val_ks_list: val.bool.set(False) # 論理演算(チェックされた項目の都道府県名を抜き出し出力) def check_box(): #チェックされた都道府県 selected_prefectures='' #各都道府県のチェックの有無を調べ、 #チェックされた都道府県をselected_prefecturesに加える #関東 for val in val_kt_list: if val.bool.get(): #出力の最初に&が入らないよう設定 if selected_prefectures=='': selected_prefectures+=val.name else: selected_prefectures+=' & '+val.name #関西 for val in val_ks_list: if val.bool.get(): if selected_prefectures=='': selected_prefectures+=val.name else: selected_prefectures+=' & '+val.name #出力 print(selected_prefectures) btn1 = ttk.Button(frame2, text='全選択', padding=5, command=check_all_kanto_checkboxes) btn1.grid(row=5,column=0,pady=5) btn2 = ttk.Button(frame2, text='全解除', padding=5, command=clear_all_kanto_checkboxes) btn2.grid(row=5,column=1,pady=5) btn3 = ttk.Button(frame3, text='全選択', padding=5, command=check_all_kansai_checkboxes) btn3.grid(row=5,column=0,pady=5) btn4 = ttk.Button(frame3, text='全解除', padding=5, command=clear_all_kansai_checkboxes) btn4.grid(row=5,column=1,pady=5) btn5 = ttk.Button(text='集計', padding=5, command=check_box) btn5.grid(row=5,column=0,pady=5) btn6 = ttk.Button(text='キャンセル', padding=5) btn6.grid(row=5,column=1,pady=5) selected_frame.set(-1) change_selected_frame() root.mainloop()

コード内に各種説明を添えていますが、わからない部分があればコメントください。

投稿2019/09/20 09:06

amahara_waya

総合スコア1029

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

3265462164

2019/09/24 00:09

amahara_wayaさん、どうもありがとうございました!! クラス化は調べていたのですが、各サイトで記述しているコードを今回のように自分がおこないたい動作に落とし込むことができず困っておりました。 非常に参考になります。 記述していただいたコードをもとに色々触ってみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問