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

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

ただいまの
回答率

90.00%

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 40

syen2501

score 36

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

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

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

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

# -*- coding: utf8 -*-
import csv
import sys
from tkinter import *
from tkinter import ttk

import pandas as pd

data = pd.read_csv('F:\\sample.csv')
# ウィンドウのサイズ
root2.geometry('1500x800')

root2 = Tk()
def ContinuedData(from_num, to_num):
    for column_num in range(from_num, to_num):
        if column_num == 0:
            # 期待動作を表示
            for index_num in range(len(data.columns)):
                expectedvalue = StringVar()
                value_textbox = Entry(root2, width=20, textvariable=expectedvalue)
                value_textbox.insert(END, data.values[column_num][index_num])
                value_textbox.place(x=200 + (index_num * 200), y=5 + (column_num * 30))
                before_value_list.append(data.values[column_num][index_num])
                value_list.append(expectedvalue)
        else:
            for index_num in range(len(data.columns)):
            # 期待動作を表示
                if not value_list[index_num].get() == before_value_list[index_num]:
                    # 1行目で編集を行った場合
                    if str(before_value_list[index_num]) in str(value_list[index_num].get()):
                        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]))]
                        add_word = value_list[index_num].get().replace(value, '*')
                        expectedvalue = StringVar()
                        value_textbox = Entry(root2, width=20, textvariable=expectedvalue)
                        value_textbox.insert(END, add_word.replace('*', data.values[column_num][index_num]))
                        # expectedvalue.set(add_word.replace('*', data.values[column_num][index_num]))
                        value_textbox.place(x=200 + (index_num * 200), y=5 + (column_num * 30))
                        value_list.append(expectedvalue)
                    # 1行目で空欄にした場合
                    else:
                        expectedvalue = StringVar()
                        value_textbox = Entry(root2, width=20, textvariable=expectedvalue)
                        value_textbox.insert(END, '')
                        # expectedvalue.set('')
                        value_textbox.place(x=200 + (index_num * 200), y=5 + (column_num * 30))
                        value_list.append(expectedvalue)                            
                # 1行目で変更を行わなかった場合
                else:
                    expectedvalue = StringVar()
                    value_textbox = Entry(root2, width=20, textvariable=expectedvalue)
                    # expectedvalue.set(data.values[column_num][index_num])
                    value_textbox.insert(END, data.values[column_num][index_num])
                    value_textbox.place(x=200 + (index_num * 200), y=5 + (column_num * 30))
                    value_list.append(expectedvalue)

### tklinterのコマンドを複数入力できるようにする
def Combine_funcs(*funcs):
    def combined_func(*args, **kwargs):
        for f in funcs:
            f(*args, **kwargs)
    return combined_func
ContinuedData(0,1)

# この関数で編集後のデータを表示しようとしている
def Exchange(value_list):
    for value in value_list:
        print(value.get())

# 1行目のデータを表示
ContinuedData(0,1)
continue_button = Button(root2, text=u'表示', width=10, command=lambda:Combine_funcs(ContinuedData(1, len(data.index)), continue_button.place_forget()))
continue_button.place(x=20,y=40)

exchange_button = Button(root2, text=u'変換', width=10, command=Exchange(value_list))
exchange_button.place(x=1300, y=500)

root2.mainloop()

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

こんな感じ?

# -*- coding: utf8 -*-
import csv
import sys
from tkinter import *

import pandas as pd

data = pd.read_csv('sample.csv')

root = Tk()
root.geometry('640x480')

entries_frames = Frame(root)
entries_frames.pack()

shown_entries = []

def show_items(items):
    frame = Frame(entries_frames)
    frame.pack()
    entries = [Entry(frame, width=20) for item in items]
    for entry, item in zip(entries, items):
        entry.insert(END, item)
        entry.pack(side='left')
    shown_entries.append(entries)


def show_next():
    if len(shown_entries) == len(data):
        return
    last_items = data.iloc[len(shown_entries) - 1].values
    next_items = data.iloc[len(shown_entries)].values
    entry_items = [entry.get() for entry in shown_entries[-1]]
    items = []
    for last_item, next_item, entry_item in zip(last_items, next_items, entry_items):
        print(last_item, next_item, entry_item)
        if last_item in entry_item:
            items.append(entry_item.replace(last_item, next_item))
        else:
            items.append('')
    show_items(items) 

# この関数で編集後のデータを表示しようとしている
def exchange():
    for items in shown_entries[-1]:
        print(items.get())

# 1行目のデータを表示
show_items(data.iloc[0].values)
continue_button = Button(root, text=u'表示', width=10, command=show_next)
continue_button.pack()

exchange_button = Button(root, text=u'変換', width=10, command=exchange)
exchange_button.pack()

root.mainloop()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/04 15:07 編集

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

    キャンセル

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

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる