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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3757閲覧

【Python】【Tkinter】表の各行の横に設定したCheckboxについて、チェックされたレコード番号を取得したい

simatanuki

総合スコア1

Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/28 10:54

前提・実現したいこと

【Python】【Tkinter】表の各行の横に設定したCheckboxについて、チェックされたレコード番号を取得したい
ここに質問の内容を詳しく書いてください。
Tkinterのチェックボックスを複数配置し、チェックボックスを押したときに値(True、False)を取得する関数をつくりたいです。

発生している問題・エラーメッセージ

Tkinterで、七行の表を作って、その横にチェックボックスを設定するところまでは実装できたのですが、、、 チェックを入れたボックスが何行目にあるかを取得する機能を付けることができません。 どうしたらよいでしょうか。 いまのところ、できているコードと出力画面を以下に示します。。。 どうぞよろしくお願いします。

Pythonのソースコード

import tkinter from tkinter import * import tkinter.ttk # マウスボタンが押されていているかどうかの判断用 press = False #------------------------------------------------------------ def btn_click(bln): print(bln,"★",btn) # chk_bln[i].set(bln[i]) # counter=0 # for i in range(erow-2): # print(bln,"★",i) # if bln[i]: # print(counter[i]," : ",bln[i]) # chk_bln[i]=bln #------------------------------------------------------------ root = tkinter.Tk() root.title('○○物資配布先候補 編集対象選択画面') #タイトル root.geometry('640x200') #サイズ #表用のリスト(あとでExcel読み込みに対応させる) list_keyword = ['○○○○ ○○○○○○','◇◇◇◇ ◇◇◇◇◇◇','□□□□ □□□□□□','△△△△ △△△△△△','○○◇◇ ○○◇◇○○','△△○○','□□△△□□'] list_pref = ['東京','東京','東京','東京','東京','東京','東京'] list_city = ['八王子','八王子','世田谷区','調布市','小平市','練馬区','武蔵野市'] list_title = ['生活補助','生活補助','生活補助','高齢者','障害者','生活補助','障害者'] list_tel = ['042-***-****','03-****-****','03-****-****','03-****-****','03-****-****','042-***-****','03-****-****'] num_list = len(list_keyword) #リストの数 #Canvas widgetを生成 canvas = tkinter.Canvas(root,width=640,height=400,bg='white') #背景を白に canvas.grid(row=1,rowspan=num_list,column=0,columnspan=5) #7行x5列分 #スクロールバー vbar=tkinter.ttk.Scrollbar(root,orient=tkinter.VERTICAL) #縦方向 vbar.grid(row=1,rowspan=7,column=5,sticky='ns') #7行分の長さで設置 #スクロールバーの制御をCanvasに通知する処理 vbar.config(command=canvas.yview) #Canvasの可動域をスクロールバーに通知する処理 canvas.config(yscrollcommand=vbar.set) #スクロール可動域<=これがないと、どこまでもスクロールされてしまう。 sc_hgt=int(150/6*(num_list+1)) #スクロールの縦の範囲 リストの数+ヘッダー分に canvas.config(scrollregion=(0,0,500,sc_hgt)) #Frameを作成 frame = tkinter.Frame(canvas,bg='white') #背景を白に #frameをcanvasに配置 canvas.create_window((0,0),window=frame,anchor=tkinter.NW,width=canvas.cget('width')) #anchor<=NWで左上に寄せる #header row=1に設定する文字列 余白は0に e0=tkinter.Label(frame,width=5,text='select',background='white') e0.grid(row=1,column=0,padx=0,pady=0,ipadx=0,ipady=0) #0列目 # ボタンの作成 btn = tkinter.Button(root, text='選択', command=lambda:btn_click(True)) btn.place(x=15, y=0) #ボタンを配置する位置の設定 #---------------------------------------------------------------- e1=tkinter.Label(frame,width=25,text='団体名',background='white') e1.grid(row=1,column=1,padx=0,pady=0,ipadx=0,ipady=0) #1列目 e2=tkinter.Label(frame,width=12,text='都道府県',background='white') e2.grid(row=1,column=2,padx=0,pady=0,ipadx=0,ipady=0) #2列目 e3=tkinter.Label(frame,width=12,text='市町村',background='white') e3.grid(row=1,column=3,padx=0,pady=0,ipadx=0,ipady=0) #2列目 e4=tkinter.Label(frame,width=12,text='活動内容',background='white') e4.grid(row=1,column=4,padx=0,pady=0,ipadx=0,ipady=0) #3列目 e5=tkinter.Label(frame,width=14,text='電話番号',background='white') e5.grid(row=1,column=5,padx=0,pady=0,ipadx=0,ipady=0) #4列目 irow = 2 irow0=2 bln={} chk_bln = {} erow=num_list+irow0 while irow < erow: #リストの数分ループしてLabelとチェックボックスを設置 #色の設定 if irow%2==0: color='#cdfff7' #薄い青 else: color='white' #チェックボックスの設置 bln[irow]=tkinter.BooleanVar() bln[irow].set(False) #チェックボックスの初期値 chk = tkinter.Checkbutton(frame,variable = irow, text="", width=5,background='white') chk.grid(row=irow,column=0,padx=0,pady=0,ipadx=0,ipady=0) #0列目 #検索キーワード a1=list_keyword[irow-irow0] b1=tkinter.Label(frame,width=25,text=a1,background=color) b1.grid(row=irow,column=1,padx=0,pady=0,ipadx=0,ipady=0) #1列目 #検索順位 a2=list_pref[irow-irow0] b2=tkinter.Label(frame,width=10,text=a2,background=color) b2.grid(row=irow,column=2,padx=0,pady=0,ipadx=0,ipady=0) #2列目 #検索順位 a3=list_city[irow-irow0] b3=tkinter.Label(frame,width=10,text=a3,background=color) b3.grid(row=irow,column=3,padx=0,pady=0,ipadx=0,ipady=0) #2列目 #記事タイトル a4=list_title[irow-irow0] b4=tkinter.Label(frame,width=12,text=a4,background=color) b4.grid(row=irow,column=4,padx=0,pady=0,ipadx=0,ipady=0) #3列目 #記事タイトル2 a5=list_tel[irow-irow0] b5=tkinter.Label(frame,width=14,text=a5,background=color) b5.grid(row=irow,column=5,padx=0,pady=0,ipadx=0,ipady=0) #4列目 irow=irow+1 #ウィンドウを動かす root.mainloop()

試したこと

イメージ説明

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

btn_click 関数(コールバック関数)を以下の様に書き換えます。

python

1def btn_click(bln): 2 checked_index = [i for i, b in enumerate(bln) if b.get()] 3 print(checked_index)

bln は辞書ではなくリストにします。

python

1##bln={} 2##chk_bln = {} 3bln = []

チェックボックスウィジェット(7個)を bln リストに保存します。

python

1 ##チェックボックスの設置 2 ##bln[irow]=tkinter.BooleanVar() 3 ##bln[irow].set(False) 4 5 bln.append(BooleanVar()) 6 chk = tkinter.Checkbutton(frame,variable=bln[-1], text="", width=5,background='white') 7 chk.grid(row=irow,column=0,padx=0,pady=0,ipadx=0,ipady=0) #0列目

ボタンに付けるコールバック関数の引数に bln リストを指定します。

python

1# ボタンの作成 2##btn = tkinter.Button(root, text='選択', command=lambda:btn_click(True)) 3btn = tkinter.Button(root, text='選択', command=lambda:btn_click(bln))

checkbutton

投稿2021/11/28 13:53

melian

総合スコア19805

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

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

simatanuki

2021/11/28 23:32

丁寧にお答えくださり、また、出力結果までお示し出さり、ありがとうございます。 いただいたものをもとに、手元のコードを修正しました。 ただ、、、動かして出力結果を確認しましたところ、行番号の位置のリストに数値が入っておらず、空リスト [] しか出力されません。 どこか間違いがございましょうか。 それから、、、行番号の代わりに、電話番号のリストを出力するためには、どういう変更を加えればよいでしょうか。アドバイスいただければ助かります。 修正後のコードを投稿します。できましたら、もう一声、ご教授願えれば幸いです。 お忙しいところ恐縮ですが、どうぞよろしくお願いします。 import tkinter from tkinter import * import tkinter.ttk # マウスボタンが押されていているかどうかの判断用 press = False #------------------------------------------------------------ def btn_click(bln): checked_index = [i for i, b in enumerate(bln) if b.get()] print(checked_index) # print(bln,"★",btn) # chk_bln[i].set(bln[i]) #------------------------------------------------------------ root = tkinter.Tk() root.title('○○物資配布先候補 編集対象選択画面') #タイトル root.geometry('640x200') #サイズ #表用のリスト(あとでExcel読み込みに対応させる) list_keyword = ['○○○○ ○○○○○○','◇◇◇◇ ◇◇◇◇◇◇','□□□□ □□□□□□','△△△△ △△△△△△','○○◇◇ ○○◇◇○○','△△○○','□□△△□□'] list_pref = ['東京','東京','東京','東京','東京','東京','東京'] list_city = ['八王子','八王子','世田谷区','調布市','小平市','練馬区','武蔵野市'] list_title = ['生活補助','生活補助','生活補助','高齢者','障害者','生活補助','障害者'] list_tel = ['042-***-****','03-****-****','03-****-****','03-****-****','03-****-****','042-***-****','03-****-****'] num_list = len(list_keyword) #リストの数 #Canvas widgetを生成 canvas = tkinter.Canvas(root,width=640,height=400,bg='white') #背景を白に canvas.grid(row=1,rowspan=num_list,column=0,columnspan=5) #7行x5列分 #スクロールバー vbar=tkinter.ttk.Scrollbar(root,orient=tkinter.VERTICAL) #縦方向 vbar.grid(row=1,rowspan=7,column=5,sticky='ns') #7行分の長さで設置 #スクロールバーの制御をCanvasに通知する処理 vbar.config(command=canvas.yview) #Canvasの可動域をスクロールバーに通知する処理 canvas.config(yscrollcommand=vbar.set) #スクロール可動域<=これがないと、どこまでもスクロールされてしまう。 sc_hgt=int(150/6*(num_list+1)) #スクロールの縦の範囲 リストの数+ヘッダー分に canvas.config(scrollregion=(0,0,500,sc_hgt)) #Frameを作成 frame = tkinter.Frame(canvas,bg='white') #背景を白に #frameをcanvasに配置 canvas.create_window((0,0),window=frame,anchor=tkinter.NW,width=canvas.cget('width')) #anchor<=NWで左上に寄せる #header row=1に設定する文字列 余白は0に e0=tkinter.Label(frame,width=5,text='select',background='white') e0.grid(row=1,column=0,padx=0,pady=0,ipadx=0,ipady=0) #0列目 # ボタンの作成 #btn = tkinter.Button(root, text='選択', command=lambda:btn_click(True)) btn = tkinter.Button(root, text='選択', command=lambda:btn_click(bln)) btn.place(x=15, y=0) #ボタンを配置する位置の設定 #---------------------------------------------------------------- e1=tkinter.Label(frame,width=25,text='団体名',background='white') e1.grid(row=1,column=1,padx=0,pady=0,ipadx=0,ipady=0) #1列目 e2=tkinter.Label(frame,width=12,text='都道府県',background='white') e2.grid(row=1,column=2,padx=0,pady=0,ipadx=0,ipady=0) #2列目 e3=tkinter.Label(frame,width=12,text='市町村',background='white') e3.grid(row=1,column=3,padx=0,pady=0,ipadx=0,ipady=0) #2列目 e4=tkinter.Label(frame,width=12,text='活動内容',background='white') e4.grid(row=1,column=4,padx=0,pady=0,ipadx=0,ipady=0) #3列目 e5=tkinter.Label(frame,width=14,text='電話番号',background='white') e5.grid(row=1,column=5,padx=0,pady=0,ipadx=0,ipady=0) #4列目 irow = 2 irow0=2 #bln={} #chk_bln = {} bln=[] erow=num_list+irow0 while irow < erow: #リストの数分ループしてLabelとチェックボックスを設置 #色の設定 if irow%2==0: color='#cdfff7' #薄い青 else: color='white' # #チェックボックスの設置 # bln[irow]=tkinter.BooleanVar() # bln[irow].set(False) #チェックボックスの初期値 bln.append(BooleanVar()) chk = tkinter.Checkbutton(frame,variable=bln[-1], text="", width=5,background='white') chk.grid(row=irow,column=0,padx=0,pady=0,ipadx=0,ipady=0) #0列目 chk = tkinter.Checkbutton(frame,variable = irow, text="", width=5,background='white') chk.grid(row=irow,column=0,padx=0,pady=0,ipadx=0,ipady=0) #0列目 #検索キーワード a1=list_keyword[irow-irow0] b1=tkinter.Label(frame,width=25,text=a1,background=color) b1.grid(row=irow,column=1,padx=0,pady=0,ipadx=0,ipady=0) #1列目 #検索順位 a2=list_pref[irow-irow0] b2=tkinter.Label(frame,width=10,text=a2,background=color) b2.grid(row=irow,column=2,padx=0,pady=0,ipadx=0,ipady=0) #2列目 #検索順位 a3=list_city[irow-irow0] b3=tkinter.Label(frame,width=10,text=a3,background=color) b3.grid(row=irow,column=3,padx=0,pady=0,ipadx=0,ipady=0) #2列目 #記事タイトル a4=list_title[irow-irow0] b4=tkinter.Label(frame,width=12,text=a4,background=color) b4.grid(row=irow,column=4,padx=0,pady=0,ipadx=0,ipady=0) #3列目 #記事タイトル2 a5=list_tel[irow-irow0] b5=tkinter.Label(frame,width=14,text=a5,background=color) b5.grid(row=irow,column=5,padx=0,pady=0,ipadx=0,ipady=0) #4列目 irow=irow+1 #ウィンドウを動かす root.mainloop()
melian

2021/11/28 23:47

現状、以下の様になっています。コメントを入れた行から下の部分を削除して下さい bln.append(BooleanVar()) chk = tkinter.Checkbutton(frame,variable=bln[-1], text="", width=5,background='white') chk.grid(row=irow,column=0,padx=0,pady=0,ipadx=0,ipady=0) #0列目 # 以下の2行を削除して下さい chk = tkinter.Checkbutton(frame,variable = irow, text="", width=5,background='white') chk.grid(row=irow,column=0,padx=0,pady=0,ipadx=0,ipady=0) #0列目
simatanuki

2021/11/29 00:38

お忙しい中、ありがとうございます。 いただいたアドバイスに従い、変更したつもりが、もとのコードをコメントアウトしていなかったのですね。 私にミスまで丁寧にご指摘くださり、本当に感謝です。 お陰様で、チェックした位置を示す数値のリストを表示できるようになりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問