🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Tkinter

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

Q&A

1回答

2519閲覧

テキストボックスに入力した後の値を保持したい

syen2501

総合スコア38

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2019/12/03 06:52

pythonでcsvファイルで記載した表を読み込み、その値をテキストファイルに表示させる
というものを作成しています。

操作として、
まず、1行目のデータをテキストボックスを用いて表示し、追加したい情報を追加する。
次に、表示ボタンを押した時にその追加した情報を反映させた状態で2行目以降を表示させます。
最後に2行目以降のテキストボックスを編集し、変換ボタンを押して表示しているデータを保持します。

例)
下記に記載のsample.csvを読み込ませると、「りんご,バナナ,メロン」が表示されます。
そのなかの「りんご」を「りんごss」のように追加し表示ボタンを押すと2行目以降のデータの
「いちご」の値も「いちごss」と表示される。
ここまでは出来た。

しかし、最後のテキストボックスの値を編集し保存する方法が分からず困っています。
何か意見を頂ければ幸いです。宜しくお願い致します。

python

1# -*- coding: utf8 -*- 2import csv 3import sys 4from tkinter import * 5from tkinter import ttk 6 7import pandas as pd 8 9data = pd.read_csv('F:\sample.csv') 10# ウィンドウのサイズ 11root2.geometry('1500x800') 12 13root2 = Tk() 14def ContinuedData(from_num, to_num): 15 for column_num in range(from_num, to_num): 16 if column_num == 0: 17 # 期待動作を表示 18 for index_num in range(len(data.columns)): 19 expectedvalue = StringVar() 20 value_textbox = Entry(root2, width=20, textvariable=expectedvalue) 21 value_textbox.insert(END, data.values[column_num][index_num]) 22 value_textbox.place(x=200 + (index_num * 200), y=5 + (column_num * 30)) 23 before_value_list.append(data.values[column_num][index_num]) 24 value_list.append(expectedvalue) 25 else: 26 for index_num in range(len(data.columns)): 27 # 期待動作を表示 28 if not value_list[index_num].get() == before_value_list[index_num]: 29 # 1行目で編集を行った場合 30 if str(before_value_list[index_num]) in str(value_list[index_num].get()): 31 value = value_list[index_num].get()[value_list[index_num].get().find(before_value_list[index_num]):int(value_list[index_num].get().find(before_value_list[index_num]) + len(before_value_list[index_num]))] 32 add_word = value_list[index_num].get().replace(value, '*') 33 expectedvalue = StringVar() 34 value_textbox = Entry(root2, width=20, textvariable=expectedvalue) 35 value_textbox.insert(END, add_word.replace('*', data.values[column_num][index_num])) 36 # expectedvalue.set(add_word.replace('*', data.values[column_num][index_num])) 37 value_textbox.place(x=200 + (index_num * 200), y=5 + (column_num * 30)) 38 value_list.append(expectedvalue) 39 # 1行目で空欄にした場合 40 else: 41 expectedvalue = StringVar() 42 value_textbox = Entry(root2, width=20, textvariable=expectedvalue) 43 value_textbox.insert(END, '') 44 # expectedvalue.set('') 45 value_textbox.place(x=200 + (index_num * 200), y=5 + (column_num * 30)) 46 value_list.append(expectedvalue) 47 # 1行目で変更を行わなかった場合 48 else: 49 expectedvalue = StringVar() 50 value_textbox = Entry(root2, width=20, textvariable=expectedvalue) 51 # expectedvalue.set(data.values[column_num][index_num]) 52 value_textbox.insert(END, data.values[column_num][index_num]) 53 value_textbox.place(x=200 + (index_num * 200), y=5 + (column_num * 30)) 54 value_list.append(expectedvalue) 55 56### tklinterのコマンドを複数入力できるようにする 57def Combine_funcs(*funcs): 58 def combined_func(*args, **kwargs): 59 for f in funcs: 60 f(*args, **kwargs) 61 return combined_func 62ContinuedData(0,1) 63 64# この関数で編集後のデータを表示しようとしている 65def Exchange(value_list): 66 for value in value_list: 67 print(value.get()) 68 69# 1行目のデータを表示 70ContinuedData(0,1) 71continue_button = Button(root2, text=u'表示', width=10, command=lambda:Combine_funcs(ContinuedData(1, len(data.index)), continue_button.place_forget())) 72continue_button.place(x=20,y=40) 73 74exchange_button = Button(root2, text=u'変換', width=10, command=Exchange(value_list)) 75exchange_button.place(x=1300, y=500) 76 77root2.mainloop() 78

<sample.csv>
赤いもの,黄色いもの,緑のもの
りんご,バナナ,メロン
いちご,レモン,すいか

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

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

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

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

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

guest

回答1

0

こんな感じ?

python

1# -*- coding: utf8 -*- 2import csv 3import sys 4from tkinter import * 5 6import pandas as pd 7 8data = pd.read_csv('sample.csv') 9 10root = Tk() 11root.geometry('640x480') 12 13entries_frames = Frame(root) 14entries_frames.pack() 15 16shown_entries = [] 17 18def show_items(items): 19 frame = Frame(entries_frames) 20 frame.pack() 21 entries = [Entry(frame, width=20) for item in items] 22 for entry, item in zip(entries, items): 23 entry.insert(END, item) 24 entry.pack(side='left') 25 shown_entries.append(entries) 26 27 28def show_next(): 29 if len(shown_entries) == len(data): 30 return 31 last_items = data.iloc[len(shown_entries) - 1].values 32 next_items = data.iloc[len(shown_entries)].values 33 entry_items = [entry.get() for entry in shown_entries[-1]] 34 items = [] 35 for last_item, next_item, entry_item in zip(last_items, next_items, entry_items): 36 print(last_item, next_item, entry_item) 37 if last_item in entry_item: 38 items.append(entry_item.replace(last_item, next_item)) 39 else: 40 items.append('') 41 show_items(items) 42 43# この関数で編集後のデータを表示しようとしている 44def exchange(): 45 for items in shown_entries[-1]: 46 print(items.get()) 47 48# 1行目のデータを表示 49show_items(data.iloc[0].values) 50continue_button = Button(root, text=u'表示', width=10, command=show_next) 51continue_button.pack() 52 53exchange_button = Button(root, text=u'変換', width=10, command=exchange) 54exchange_button.pack() 55 56root.mainloop()

投稿2019/12/04 05:45

shiracamus

総合スコア5406

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

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

shiracamus

2019/12/04 06:08 編集

Python3 ならば、先頭の coding 指定は不要です。 文字列の u 指定も不要です。 タグに Python も指定するといいですよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問