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

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

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

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

Python

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

Q&A

解決済

1回答

1007閲覧

python tkinterでentry_連番の入力項へのリストデータの挿入

akiteru

総合スコア18

Tkinter

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

Python

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

0グッド

0クリップ

投稿2020/04/15 04:00

前提・実現したいこと

pythonで自分用の住所録を作っています。entry_1,_2,_3,****の様な連番添え字のENTRYへ、リスト型の値を表示させたい。地道に挿入の文章を書いた場合はできるのですが同じ作業の繰り返しの為、for文等で書けないものでしょうか。
但し、添え字の順番とリスト型のデータの順番は同一ではありません。
下記コードのdef insert_1(self)のこと(正常に動作)をdef insert_2(self)のような形式(エラーとなる)で記述したい。
宜しくお願いします。

該当のソースコード

ソースコード import tkinter as tk import tkinter.ttk as ttk class MainWindow(ttk.Frame): def __init__(self, parent): super(MainWindow, self).__init__(parent) self.parent = parent self.cleate_entry() # ********* ここが問題提起部分 # この実行結果が実現したい(同一作業の繰り返しで冗長) self.insert_1() # 例えばこの様に書けないののか?(プログラムは下部に有ります)。実際はエラーとなります #self.insert_2() def cleate_entry(self): self.frame1 = tk.Frame(pady=6) self.frame1.pack(fill="x") self.entry1 = tk.Entry(self.frame1,font=("",14),justify="center",width=60) self.entry1.pack(side="left") self.frame2 = tk.Frame(pady=6) self.frame2.pack(fill="x") self.entry2 = tk.Entry(self.frame2,font=("",14),justify="center",width=60) self.entry2.pack(side="left") self.frame3 = tk.Frame(pady=6) self.frame3.pack(fill="x") self.entry3 = tk.Entry(self.frame3,font=("",14),justify="center",width=60) self.entry3.pack(side="left") self.frame4 = tk.Frame(pady=6) self.frame4.pack(fill="x") self.entry4 = tk.Entry(self.frame4,font=("",14),justify="center",width=60) self.entry4.pack(side="left") def insert_1(self): # 表示する値 data = [12,'a',34,'b',56,'c',78,'d'] # ***** 表示する値は必ずしもdataリストの順番ではない self.entry1.configure(state='normal') self.entry1.delete(0, 'end') self.entry1.insert('end', data[1]) self.entry1.configure(state='readonly') self.entry2.configure(state='normal') self.entry2.delete(0, 'end') self.entry2.insert('end', data[0]) self.entry2.configure(state='readonly') self.entry3.configure(state='normal') self.entry3.delete(0, 'end') self.entry3.insert('end', data[5]) self.entry3.configure(state='readonly') self.entry4.configure(state='normal') self.entry4.delete(0, 'end') self.entry4.insert('end', data[3]) self.entry4.configure(state='readonly') def insert_2(self): # 表示する値 data = [12,'a',34,'b',56,'c',78,'d'] # 表示する値のdata内での位置 ichi = [1,0,5,3] # ***** 例えばこんな感じ for i in range(4): self.entry + str(i + 1).configure(state='normal') self.entry + str(i + 1).delete(0, 'end') self.entry + str(i + 1).insert('end', data[ichi[i]]) self.entry + str(i + 1).configure(state='readonly') def quit(self, event=None): # 終了時の処理 self.master.destroy() application = tk.Tk() application.geometry("1000x600") application.title('PyPost') window = MainWindow(application) application.protocol('WM_DELETE_WINDOW', window.quit) application.mainloop()

試したこと

ここに問題に対して試したことを記載してください。

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

getattrで 添字から目的の entry を得ることができます。
(クラス以外であれば globals()やlocals() の辞書から添字→目的の変数を得られる)

operator.itemgetter を使うと、
与えた添え字の値のみのスライスを作成できるので。

python

1# 表示する値 2data = [12,'a',34,'b',56,'c',78,'d'] 3 4# 表示する値のdata内での位置 5ichi = [1,0,5,3] 6 7from operator import itemgetter 8 9sliced_data = itemgetter(*ichi)(data) 10 11for entry_idx, datum in enumerate(sliced_data, start=1): 12 entry = getattr(self, "entry{}".format(entry_idx)) 13 entry.configure(state='normal') 14 entry.delete(0, 'end') 15 entry.insert('end', datum) 16 entry.configure(state='readonly')

多分、率直にzip()でリストと一緒に回す方がわかりやすい。

targets = [self.entry1, self.entry2, self.entry3, self.entry4] for entry, idx in zip(targets, ichi): datum = data[idx] entry.configure(state='normal') entry.delete(0, 'end') entry.insert('end', datum) entry.configure(state='readonly')

追記:

毎回 readonly 解除や delete/insert をしてますが、
tk.StringVar を使うと、readonly 時でも値を設定できます。

python

1name = tk.StringVar(parent) 2addr = tk.StringVar(parent) 3tk.Entry(parent, textvar=name, state="readonly").pack() 4tk.Entry(parent, textvar=addr, state="readonly").pack() 5 6name.set("NAME") 7addr.set("ADDRESS")

投稿2020/04/15 04:48

編集2020/04/15 10:16
teamikl

総合スコア8664

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

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

akiteru

2020/04/16 07:31

毎回有難うございます。成功しました。第1案が汎用性が広いようですが、自分の現状実力より地道に第2案で行います。いずれ第1案へ移行したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問