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

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

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

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

Q&A

1回答

403閲覧

Entryを指定する文字列のClassを 'tkinter.Entry'に変更する方法

T.U..

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2022/04/06 09:32

Python初心者です。

PythonのTk.Entryを使って、文字および数値をテキストファイルからロードし、Entryにinsertしてから編集し、最終的に名前を付けて改めて保存したいと考えています。

Entryに手打ちで入れた文字および数値を名前を付けて保存することはできたのですが、一旦保存したデータから再度元のEntryに値をinsertで戻すことができません。
どうやらEntryを指定する文字列がStrであり、<class 'tkinter.Entry'>ではないため、
AttributeError: 'str' object has no attribute 'insert'
というエラーが出ているようです。
classについてよく理解できていないため、どのようにしてEntryを指定する文字列のClassを 'tkinter.Entry'に変更したらよいのか分かりません。どなたかご意見を頂けると非常に有難いです。どうぞよろしくお願い申し上げます。

保存ファイルは以下のようなものです。
{'aaa': {'deck': 'deck1', 'position': 'A1', 'vial_volume': '111'},'bbb': {'deck': 'deck1', 'position': 'A2', 'vial_volume': '2222'}}

保存したデータを読み込む部分のコードです。
def click_load_button():
fTyp = [("","*")]
iDir = os.path.abspath(os.path.dirname(file))
filepath = filedialog.askopenfilename(filetypes = fTyp, initialdir = iDir)
file_path.set(filepath)
if filepath[-4:] == '.txt':
f = open(filepath, encoding="utf-8")
text_data = f.read()
textBox.insert(END, text_data)
dict=literal_eval(text_data)
key_names=dict.keys()

for name in key_names: str_position = dict[name]['position'] str_deck = dict[name]['deck'] str_volume= dict[name]['vial_volume'] Entry_name=str_deck+'_'+str_position+'_name' Entry_name_volume=str_deck+'_'+str_position+'_volume' print (Entry_name)         #deck1_A1_nameとでてきます。 Entry_name.insert(tk.END, name) #NG AttributeError: 'str' object has no attribute 'insert'

deck1_A1_name.insert(tk.END, name) #Entry_nameに格納されているdeck1_A1_nameを直接打ち込むと問題なくEntryにnameに格納されている文字が入力されます。

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

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

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

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

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

guest

回答1

0

コードを 読んでもよくわからなかったのですが、「Entryを指す変数の名前を文字列で与えたときにそれをEntryに変換したい」ということでしょうか。
「deck1_A1_name」が目的のEntryであって「deck1_A1_name.insert(tk.END, name)」のようにしたいということですよね。

そのままの考えかたで実現する方法も無くはありませんが、良い方法とは言えません。
その代り、そのように複数あるオブジェクトはリスト や辞書で管理するのが常套手段です。Entryの作成時に個別の変数に入れるのではなく(入れておいてもいいですが)、entriesというような辞書にentries['deck1_A1_name']として保存します。
そうすれば、必要なときに、entries['deck1_A1_name']として参照できるし、entries['deck1_A1_name'].insert()のように使うことができます。

投稿2022/04/06 09:57

TakaiY

総合スコア12747

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

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

T.U..

2022/04/08 09:08

コメントありがとうございます。教えて頂いた通り辞書に保存したentryの名前を使うことで、ロードした内容を特定のEntryに入力することができました。 その後、別のFrameで同じようなことを試したところ今度はうまくできませんでした。成功した方は辞書に保存したentryのClassは'tkinter.Entry'になっていますが、うまく動かない方は'method'になってしまいました。 下に、動かない方のEntry作成部分を貼り付けましたので、コメントを頂けると非常にありがたいです。どうぞよろしくお願い申し上げます。 procedure_entries_index=[] procedure_list=['content_from', 'content_to', 'content_volume'] for i in range(4): procedure_index=str(i+1) procedure_entries.append(procedure_index) for ii, procedure_element in enumerate(procedure_list): procedure_entries.append(procedure_index+'_'+procedure_element) aaa=tk.Label(frame_procedure,text=procedure_index) procedure_entries[3*i]=tk.Entry(frame_procedure, width=20) procedure_entries[3*i+1]=tk.Entry(frame_procedure, width=20) procedure_entries[3*i+2]=tk.Entry(frame_procedure, width=20) aaa.grid(row=i+1, column=0, padx=5) procedure_entries[3*i].grid(row=i+1, column=1, padx=5) procedure_entries[3*i+1].grid(row=i+1, column=2, padx=5) procedure_entries[3*i+2].grid(row=i+1, column=3, padx=5)
TakaiY

2022/04/08 14:39

質問欄ではインデントが扱えないので見てもわかりません。 内容が変ってしまったように思うので、別の質問を立ててください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問