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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Tkinter

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

Python

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

Q&A

解決済

2回答

2268閲覧

tkでテキストボックスをfor文で作成したい。

mikami_r

総合スコア13

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/05/21 00:14

PythonにてCSVで縦軸のを読込、リスト化し、要素をTkにラベリングしています。
ラベリングした隣にテキストボックスをリストの要素数に合わせて作成したいため、
テキストボックスをfor文で作成したいです。

現状のコードは下記です。

Python

1import tkinter as tk #tkinterをインポートしてtkと略して使用する。 2import csv 3 4#アクセスパス登録 5imput_sample = "C:\Users\11-11171008\Desktop\imput_sample.csv" 6output_sample = "C:\Users\11-11171008\Desktop\output_sample.csv" 7 8#ユーザフォーム構築 9root = tk.Tk() #画面を作る 10root.geometry("800x1000") #画面サイズ指定(ピクセル単位) 11root.title("管理ソフト") #ウインドのタイトルを設定 12 13#対象DPリストラインの表示 14 15#対象リストCSVの読込 16open_file = imput_sample #ファイルのパスを指定 17f = open(open_file,'r') #ファイルをオープン 18rows = csv.reader(f) #ファイルからデータを読み込み 19dp_list = [] #要素格納リストの作成 20 21for row in rows: # for文で行を1つずつ取り出す 22 dp = row[0] #リストのインデックス0を抽出 23 dp_list.append(dp)#抽出データをリストに格納 24 25f.close() #開いたファイルをクローズ(7) 26#print(dp_list) 27 28 29#DP配置位置の原点変数宣言 30DP_x = 20 31DP_y = 40 32box_no = 0 33 34 35#DP対象リストのラベリング 36for DP_name in dp_list: 37 38 #ラベル配置 39 dp_lbl = tk.Label(text=DP_name, font=("",12)) 40 dp_lbl.place(x=DP_x, y=DP_y) 41 42 43 #テキストボックス配置 44 qr_txt = "text_box" + str(box_no) 45 qr_txt = tk.Entry(width=100) 46 qr_txt.place(x=DP_x + 60, y=DP_y) 47 box_no = box_no + 1 48 49 50 #ボックス配置位置の調整 51 DP_y = DP_y + 23 52 53def kannryou_syori(): #テキストボックス情報の登録 54 qr_val =qr_txt.get() 55 print(qr_val) 56 57 58 59touroku_btn = tk.Button(text="登録",command=kannryou_syori) #ボタン作成 60touroku_btn.place(x=700, y=900) 61 62tk.mainloop() #作成ウインドの表示と維持 63 64

上記のコードでテキストボックスはfor文で生成できていますが、
生成後のコメントボックスをgetするとコメントボックスがfor文で最後に
生成されたものしか取得できません。

原因はqr_txtで毎回、forを回しているからかとは思っておりますが、
qr_txt + 変数 のようにしてforで回す例えば、
qr_txt_1、qr_txt_2、qr_txt_3・・・と宣言できれば解決するかと
思うのですが処理方法が調べてもわかりませんでした。

誠に申し訳ありませんがご教授頂けると幸いです。

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

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

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

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

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

guest

回答2

0

別解で

qr_txt_1、qr_txt_2、qr_txt_3・・・と宣言できれば解決するかと

思うのですが

Pythonの変数名ではなく、tcl/tk 側の命名で
widget に nameを付ける事ができます。

children で子ウィジェット一覧を得られるので、
ウィジェットの構造を適切に組み立てれば、name 付けも省けます。

python

1 2import tkinter as tk 3root = tk.Tk() 4 5# Entry を格納する親ウィジェット 6# 他の用途にEntry を使いたい場合、混ざるのを避けるため。 7frame = tk.Frame(root) 8frame.pack() 9 10# grid() の引数に 0 開始の連番を指定する為、 11# widget が1開始のレン版にしたい場合は enumerate() を使います。 12for num, row in enumerate(range(3), start=1): 13 # textbox_01, textbox_02, textbox_03 14 entry = tk.Entry(frame, name=f"textbox_{num:02}") 15 entry.grid(row=row, column=0) 16 17def clicked(): 18 # .children 辞書で name, widget が参照可能 19 for name, entry in frame.children.items(): 20 # name が "textbox_" で始まる場合 21 if name.startswith("textbox_"): 22 print(name, entry, entry.get()) 23 24 # 個別に問い合わせたい場合は、nametowidget() 25 try: 26 entry02 = frame.nametowidget("textbox_02") 27 except KeyError: 28 pass # 該当する name が見つからなかった場合 29 else: 30 print(entry02, entry02.get()) 31button = tk.Button(root, text="OK", command=clicked) 32button.pack() 33 34root.mainloop()

投稿2021/05/21 05:55

teamikl

総合スコア8760

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

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

mikami_r

2021/05/21 11:54

上記回答御礼申し上げます。より詳しくご教授頂き、今後の参考とさせていただきます。
guest

0

ベストアンサー

リストに補完しておけば良いのではないでしょうか。

確認確認はしていませんが、こんな感じです。

python

1qr_txt_list = [] 2for DP_name in dp_list: 3 4 #ラベル配置 5 dp_lbl = tk.Label(text=DP_name, font=("",12)) 6 dp_lbl.place(x=DP_x, y=DP_y) 7 8 9 #テキストボックス配置 10 qr_txt = "text_box" + str(box_no) 11 qr_txt = tk.Entry(width=100) 12 qr_txt.place(x=DP_x + 60, y=DP_y) 13 box_no = box_no + 1 14 qr_txt_list.append(qr_txt) 15 16 17 #ボックス配置位置の調整 18 DP_y = DP_y + 23 19 20def kannryou_syori(i): #テキストボックス情報の登録 21 qr_val =qr_txt_list[i].get() 22 print(qr_val)

なお。
qr_txt = "text_box" + str(box_no)
の直後に
qr_txt = tk.Entry(width=100)
をやっているのは意味不明です。

投稿2021/05/21 01:02

ppaul

総合スコア24670

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

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

mikami_r

2021/05/21 11:51

回答ありがとうございます。上記コメントで問題が解決しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問