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

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

ただいまの
回答率

88.23%

作ったGUIのページ内容を保存したい

解決済

回答 1

投稿 編集

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

fuji36_om

score 8

前提・実現したいこと

作ったGUIのページ内容を保存したい。

作ったGUIのページ内容(No1~No11の人物の姓、名、性別、生年月日)
をtxtデータにて保存できるようにしたい。

teratail内あるいは、その他のサイトにて似たようなことをしているプログラムはないでしょうか。

あるいは、どのようにプログラムば良いか教えていただければ幸いです。

該当のソースコード

#tkinterのインポート
import tkinter as tk

# ウィンドウを作成
root = tk.Tk()
root.title("Hello, World!") # タイトル
root.geometry("500x300") # サイズ

b = tk.Label(text="コントロール画面")# 文字の出力
b.pack()


#全Entry消去(前処理用)
def clear():
    txt_No11.delete(0, tk.END)
    txt_No12.delete(0, tk.END)
    txt_No13.delete(0, tk.END)
    txt_No21.delete(0, tk.END)
    txt_No22.delete(0, tk.END)
    txt_No23.delete(0, tk.END)
    txt_No31.delete(0, tk.END)
    txt_No32.delete(0, tk.END)
    txt_No33.delete(0, tk.END)
    txt_No41.delete(0, tk.END)
    txt_No42.delete(0, tk.END)
    txt_No43.delete(0, tk.END)
    txt_No51.delete(0, tk.END)
    txt_No52.delete(0, tk.END)
    txt_No53.delete(0, tk.END)

#全Entry再入力    
def hyoji(index):    
    txt_No11.insert(tk.END,no[index])
    txt_No21.insert(tk.END,性[index])
    txt_No31.insert(tk.END,名[index])
    txt_No41.insert(tk.END,性別[index])
    txt_No51.insert(tk.END,生年月日[index])

    index +=1
    #print('index:', index)#確認用
    if( index >= len(no)) : return
    txt_No12.insert(tk.END,no[index])
    txt_No22.insert(tk.END,性[index])
    txt_No32.insert(tk.END,名[index])
    txt_No42.insert(tk.END,性別[index])
    txt_No52.insert(tk.END,生年月日[index])

    index +=1
    #print('index:', index)#確認用
    if( index >= len(no)) : return
    txt_No13.insert(tk.END,no[index])
    txt_No23.insert(tk.END,性[index])
    txt_No33.insert(tk.END,名[index])
    txt_No43.insert(tk.END,性別[index])
    txt_No53.insert(tk.END,生年月日[index])


#前ボタン_前ページを出力
def btn_prev():
    global pageid
    if pageid-3 <0:
        return
    no[pageid] = txt_No11.get()
    print(txt_No11.get())
    clear()
    pageid-=3
    hyoji(pageid)


#次ボタン_次ページを出力
def btn_next():
    global pageid
    if pageid+3 >len(no):
        return
    clear()
    pageid+=3
    hyoji(pageid)


#保存
def btn_save():
    print('動作確認')
    return


# 各種ボタン設定
Prev_button = tk.Button(root,text='前ボタン',command = btn_prev).place(width=50,x=300,y=250)
Next_button = tk.Button(root,text='次ボタン',command = btn_next).place(width=50,x=375,y=250)
Save_button = tk.Button(root,text='保存',command = btn_save).place(width=50,x=75,y=250)


# テキスト注釈を表示
lbl_1 = tk.Label(text='No.')
lbl_1.place(x=30, y=50)

lbl_2 = tk.Label(text='姓')
lbl_2.place(x=110, y=50)

lbl_3 = tk.Label(text='名')
lbl_3.place(x=220, y=50)

lbl_4 = tk.Label(text='性別')
lbl_4.place(x=330, y=50)

lbl_5 = tk.Label(text='生年月日')
lbl_5.place(x=400, y=50)

# テキストボックス1(No)
txt_No11 = tk.Entry(width=8)
txt_No11.place(x=30, y=80)

txt_No12 = tk.Entry(width=8)
txt_No12.place(x=30, y=110)

txt_No13 = tk.Entry(width=8)
txt_No13.place(x=30, y=140)


# テキストボックス2(姓)
txt_No21 = tk.Entry(width=12)
txt_No21.place(x=110, y=80)

txt_No22 = tk.Entry(width=12)
txt_No22.place(x=110, y=110)

txt_No23 = tk.Entry(width=12)
txt_No23.place(x=110, y=140)


# テキストボックス3(名前)
txt_No31 = tk.Entry(width=12)
txt_No31.place(x=220, y=80)

txt_No32 = tk.Entry(width=12)
txt_No32.place(x=220, y=110)

txt_No33 = tk.Entry(width=12)
txt_No33.place(x=220, y=140)


# テキストボックス4(性別)
txt_No41 = tk.Entry(width=8)
txt_No41.place(x=330, y=80)

txt_No42 = tk.Entry(width=8)
txt_No42.place(x=330, y=110)

txt_No43 = tk.Entry(width=8)
txt_No43.place(x=330, y=140)


# テキストボックス5(生年月日)
txt_No51 = tk.Entry(width=12)
txt_No51.place(x=400, y=80)

txt_No52 = tk.Entry(width=12)
txt_No52.place(x=400, y=110)

txt_No53 = tk.Entry(width=12)
txt_No53.place(x=400, y=140)

no = ["1","2","3","4","5","6","7","8","9","10","11"]
性 = ["渡邊","柳川","清野","根本","阿部","稲田","木内","三宅","石村","本郷","山田"]
名 = ["沙樹","和臣","菜緒","駿斗","亜依","和徳","喜雄","美南","比呂","香帆","比呂"]
性別 = ["女","男","女","男","女","男","男","女","男","女","男","女","男"]
生年月日 = ["1988/07/15","1966/09/04","1979/06/08","1992/03/14","1977/04/04",
        "1963/11/06","1972/08/21","1992/11/30","1967/12/07","1965/03/20","1977/04/04"]
pageid = 0
hyoji(pageid)

root.mainloop( )
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

基本的にはwith openを使って指定したファイルに書き込むだけです。
ただEntryが複数あり、全て個別の変数で宣言されていると、
同じような処理にも関わらず、全ての変数に書かなければならず、
面倒な上、変更が入った場合修正忘れが出やすくなりバグの温床にもなります。
そのためEntryを配列で宣言する方法で書き直してみましたので参考の程を。

#tkinterのインポート
import tkinter as tk

# ウィンドウを作成
root = tk.Tk()
root.title("Hello, World!") # タイトル
root.geometry("500x300") # サイズ

b = tk.Label(text="コントロール画面")# 文字の出力
b.pack()

#全Entry消去(前処理用)
def clear():
    for clist in txt_list:
        for etxt in clist:
            etxt.delete(0, tk.END)

#全Entry再入力    
def hyoji(index):
    def txt_insert(txt_clist):
        txt_clist[0].insert(tk.END,no[index])
        txt_clist[1].insert(tk.END,性[index])
        txt_clist[2].insert(tk.END,名[index])
        txt_clist[3].insert(tk.END,性別[index])
        txt_clist[4].insert(tk.END,生年月日[index])

    txt_insert(txt_list[0])

    index +=1
    #print('index:', index)#確認用
    if( index >= len(no)) : return
    txt_insert(txt_list[1])

    index +=1
    #print('index:', index)#確認用
    if( index >= len(no)) : return
    txt_insert(txt_list[2])


#前ボタン_前ページを出力
def btn_prev():
    global pageid
    if pageid-3 <0:
        return
    no[pageid] = txt_list[0][0].get()
    print(txt_list[0][0].get())
    clear()
    pageid-=3
    hyoji(pageid)


#次ボタン_次ページを出力
def btn_next():
    global pageid
    if pageid+3 >len(no):
        return
    clear()
    pageid+=3
    hyoji(pageid)


#保存
def btn_save():
    def write_txt(f, txt_clist):
        #入力チェック
        for etxt in txt_clist:
            #No.~生年月日まで全て入力されていなければ書き出し対象外
            if not etxt.get(): return
        f.write(f'No.:{txt_clist[0].get()}、姓:{txt_clist[1].get()}、名:{txt_clist[2].get()}、性別:{txt_clist[3].get()}、生年月日:{txt_clist[4].get()}\n')

    print('動作確認')
    #追記でファイルに書き込み
    with open('test.txt', mode='a') as f:
        for txt_clist in txt_list:
            write_txt(f, txt_clist)


# 各種ボタン設定
Prev_button = tk.Button(root,text='前ボタン',command = btn_prev).place(width=50,x=300,y=250)
Next_button = tk.Button(root,text='次ボタン',command = btn_next).place(width=50,x=375,y=250)
Save_button = tk.Button(root,text='保存',command = btn_save).place(width=50,x=75,y=250)


# テキスト注釈を表示
lbl_1 = tk.Label(text='No.')
lbl_1.place(x=30, y=50)

lbl_2 = tk.Label(text='姓')
lbl_2.place(x=110, y=50)

lbl_3 = tk.Label(text='名')
lbl_3.place(x=220, y=50)

lbl_4 = tk.Label(text='性別')
lbl_4.place(x=330, y=50)

lbl_5 = tk.Label(text='生年月日')
lbl_5.place(x=400, y=50)

# テキストボックス配列
txt_list = [[None] * 5 for i in range(3)]

# テキストボックス1(No)
txt_list[0][0] = tk.Entry(width=8)
txt_list[0][0].place(x=30, y=80)

txt_list[1][0] = tk.Entry(width=8)
txt_list[1][0].place(x=30, y=110)

txt_list[2][0] = tk.Entry(width=8)
txt_list[2][0].place(x=30, y=140)


# テキストボックス2(姓)
txt_list[0][1] = tk.Entry(width=12)
txt_list[0][1].place(x=110, y=80)

txt_list[1][1] = tk.Entry(width=12)
txt_list[1][1].place(x=110, y=110)

txt_list[2][1] = tk.Entry(width=12)
txt_list[2][1].place(x=110, y=140)


# テキストボックス3(名前)
txt_list[0][2] = tk.Entry(width=12)
txt_list[0][2].place(x=220, y=80)

txt_list[1][2] = tk.Entry(width=12)
txt_list[1][2].place(x=220, y=110)

txt_list[2][2] = tk.Entry(width=12)
txt_list[2][2].place(x=220, y=140)


# テキストボックス4(性別)
txt_list[0][3] = tk.Entry(width=8)
txt_list[0][3].place(x=330, y=80)

txt_list[1][3] = tk.Entry(width=8)
txt_list[1][3].place(x=330, y=110)

txt_list[2][3] = tk.Entry(width=8)
txt_list[2][3].place(x=330, y=140)


# テキストボックス5(生年月日)
txt_list[0][4] = tk.Entry(width=12)
txt_list[0][4].place(x=400, y=80)

txt_list[1][4] = tk.Entry(width=12)
txt_list[1][4].place(x=400, y=110)

txt_list[2][4] = tk.Entry(width=12)
txt_list[2][4].place(x=400, y=140)

no = ["1","2","3","4","5","6","7","8","9","10","11"]
性 = ["渡邊","柳川","清野","根本","阿部","稲田","木内","三宅","石村","本郷","山田"]
名 = ["沙樹","和臣","菜緒","駿斗","亜依","和徳","喜雄","美南","比呂","香帆","比呂"]
性別 = ["女","男","女","男","女","男","男","女","男","女","男","女","男"]
生年月日 = ["1988/07/15","1966/09/04","1979/06/08","1992/03/14","1977/04/04",
        "1963/11/06","1972/08/21","1992/11/30","1967/12/07","1965/03/20","1977/04/04"]
pageid = 0
hyoji(pageid)

root.mainloop()

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

同じタグがついた質問を見る