前提・実現したいこと
作成したプログラムで、No.氏名、性別、生年月日を入力した後、
CSV形式にて保存したい。
CSV形式で保存した内容を読み込む機能を付けたい。
具体的には、各リストの内容を行ごとに保存し、読み込む際は逆にプログラム内の
リストに上書きする方法を取りたいです。
発生している問題・エラーメッセージ
試しに保存してみたが、CSV形式ではなさそう…。
読み込みの関数は、手入力したものを用意して試しましたが、エラーしか起こさなかったので削除しています。
該当のソースコード
python
1#tkinterのインポート 2import tkinter as tk 3from tkinter import messagebox 4from dateutil.parser import parse 5 6# ウィンドウを作成 7root = tk.Tk() 8root.title("Hello, World!") # タイトル 9root.geometry("500x300") # サイズ 10 11b = tk.Label(text="コントロール画面")# 文字の出力 12b.pack() 13 14 15#全Entry消去 16def clear(): 17 txt_No11.delete(0, tk.END) 18 txt_No12.delete(0, tk.END) 19 txt_No13.delete(0, tk.END) 20 txt_No21.delete(0, tk.END) 21 txt_No22.delete(0, tk.END) 22 txt_No23.delete(0, tk.END) 23 txt_No31.delete(0, tk.END) 24 txt_No32.delete(0, tk.END) 25 txt_No33.delete(0, tk.END) 26 txt_No41.delete(0, tk.END) 27 txt_No42.delete(0, tk.END) 28 txt_No43.delete(0, tk.END) 29 txt_No51.delete(0, tk.END) 30 txt_No52.delete(0, tk.END) 31 txt_No53.delete(0, tk.END) 32 33#手入力で編集された全Entryを一時的に記憶 34def Memory(index): 35 print( " No11 {} Len:{}".format(index,len(no))) 36 no[index] = txt_No11.get() 37 姓[index] = txt_No21.get() 38 名[index] = txt_No31.get() 39 性別[index] = txt_No41.get() 40 生年月日[index] = txt_No51.get() 41 index+=1 42 print( " No12 {} Len:{}".format(index,len(no))) 43 if( index >= len(no)) : return 44 no[index] = txt_No12.get() 45 姓[index] = txt_No22.get() 46 名[index] = txt_No32.get() 47 性別[index] = txt_No42.get() 48 生年月日[index] = txt_No52.get() 49 index+=1 50 print( " No13 {} Len:{}".format(index,len(no))) 51 if( index >= len(no)) : return 52 no[index] = txt_No13.get() 53 姓[index] = txt_No23.get() 54 名[index] = txt_No33.get() 55 性別[index] = txt_No43.get() 56 生年月日[index] = txt_No53.get() 57 58#移動した先のページ内容を全Entryに再表示する 59def hyoji(index): 60 txt_No11.insert(tk.END,no[index]) 61 txt_No21.insert(tk.END,姓[index]) 62 txt_No31.insert(tk.END,名[index]) 63 txt_No41.insert(tk.END,性別[index]) 64 txt_No51.insert(tk.END,生年月日[index]) 65 66 index +=1 67 #print('index:', index)#確認用 68 if( index >= len(no)) : return 69 txt_No12.insert(tk.END,no[index]) 70 txt_No22.insert(tk.END,姓[index]) 71 txt_No32.insert(tk.END,名[index]) 72 txt_No42.insert(tk.END,性別[index]) 73 txt_No52.insert(tk.END,生年月日[index]) 74 75 index +=1 76 #print('index:', index)#確認用 77 if( index >= len(no)) : return 78 txt_No13.insert(tk.END,no[index]) 79 txt_No23.insert(tk.END,姓[index]) 80 txt_No33.insert(tk.END,名[index]) 81 txt_No43.insert(tk.END,性別[index]) 82 txt_No53.insert(tk.END,生年月日[index]) 83 84 85#(各ボタン用関数) 86#前ボタン_前ページに移る 87def btn_prev(): 88 global pageid 89 Memory(pageid) 90 if pageid-3 <0: 91 messagebox.showerror('エラー', 'これ以上は前に戻れません') 92 print("これ以上は前に戻れません") 93 return 94 if check_content(): 95 return 96 clear() 97 pageid-=3 98 hyoji(pageid) 99 100 101#次ボタン_次ページに移る 102def btn_next(): 103 global pageid 104 nextId = pageid+3 105 Memory(pageid) 106 if check_content(): 107 return 108 if(nextId) >= len(no): 109 messagebox.showerror('エラー', 'これ以上は先に進めません') 110 print("これ以上は先に進めません") 111 return 112 clear() 113 pageid+=3 114 hyoji(pageid) 115 116 117#クリアボタン_内容を消去 118def btn_clear(): 119 clear() 120 121#チェックボタン_内容をチェック 122def check_content(): 123 global pageid 124 s=error_check1(pageid) 125 errmsg = error_check2(pageid) 126 if len(errmsg) > 0: 127 if len(s) > 0: 128 s += "\n" 129 s += errmsg 130 errmsg = error_check3(pageid) 131 if len(errmsg) > 0: 132 if len(s) > 0: 133 s += "\n" 134 s += errmsg 135 errmsg = error_check4(pageid) 136 if len(errmsg) > 0: 137 if len(s) > 0: 138 s += "\n" 139 s += errmsg 140 errmsg = error_check5(pageid) 141 if len(errmsg) > 0: 142 if len(s) > 0: 143 s += "\n" 144 s += errmsg 145 146 if len(s) > 0: 147 print("[" + s + "]") 148 messagebox.showerror('エラー', s) 149 return True 150 return False 151 152#noのチェックを行う 153def error_check1(index): 154 s = "" 155 for j in range(3): 156 i = index + j 157 if(no[i].isdecimal()) == True: 158 pass 159 else: 160 if len(s) > 0: 161 s += "\n" 162 s += "{}列目の「No」に整数を入れてください".format(j+1) 163 return s 164 165#姓のチェックを行う 166def error_check2(index): 167 s = "" 168 for j in range(3): 169 i = index + j 170 if(姓[i].isalpha()) == True: 171 pass 172 else: 173 if len(s) > 0: 174 s += "\n" 175 s += "{}列目の「姓」に正しく記入してください".format(j+1) 176 return s 177 178def error_check3(index): 179 s = "" 180 for j in range(3): 181 i = index + j 182 if(名[i].isalpha()) == True: 183 pass 184 else: 185 if len(s) > 0: 186 s += "\n" 187 s += "{}列目の「名」に正しく記入してください".format(j+1) 188 return s 189 190def error_check4(index): 191 s = "" 192 for j in range(3): 193 i = index + j 194 if(性別[i]) == "男" or (性別[i]) == "女": 195 pass 196 else: 197 if len(s) > 0: 198 s += "\n" 199 s += "{}列目の「性別」に男または女で記入してください".format(j+1) 200 return s 201 202#生年月日を入力しているか確認するための関数is_date 203#error_check5に内蔵 204def is_date(string, fuzzy=False): 205 try: 206 parse(string)#parse関数が重要 207 return True 208 209 except ValueError: 210 return False 211 212def error_check5(index): 213 s = "" 214 for j in range(3): 215 i = index + j 216 if is_date(生年月日[i]) == True: 217 pass 218 else: 219 if len(s) > 0: 220 s += "\n" 221 s += "{}列目の「生年月日」に正しく記入してください".format(j+1) 222 return s 223 224#保存 225def btn_save(): 226 with open('test.csv', mode='w') as file: 227 #for num in range(4): 228 file.write(str(no) + "\n") 229 file.write(str(姓) + "\n") 230 file.write(str(名) + "\n") 231 file.write(str(性別) + "\n") 232 file.write(str(生年月日) + "\n") 233 Next_button 234 235# 各種ボタン設定 236Prev_button = tk.Button(root,text='前ボタン',command = btn_prev).place(width=50,x=330,y=250) 237Next_button = tk.Button(root,text='次ボタン',command = btn_next).place(width=50,x=380,y=250) 238Clear_button = tk.Button(root,text='クリア',command = btn_clear).place(width=50,x=25,y=250) 239Read_button = tk.Button(root,text='読込').place(width=50,x=130,y=250) 240Save_button = tk.Button(root,text='保存',command = btn_save).place(width=50,x=180,y=250) 241 242 243# テキスト注釈を表示 244lbl_1 = tk.Label(text='No.') 245lbl_1.place(x=30, y=50) 246 247lbl_2 = tk.Label(text='姓') 248lbl_2.place(x=110, y=50) 249 250lbl_3 = tk.Label(text='名') 251lbl_3.place(x=220, y=50) 252 253lbl_4 = tk.Label(text='性別') 254lbl_4.place(x=330, y=50) 255 256lbl_5 = tk.Label(text='生年月日') 257lbl_5.place(x=400, y=50) 258 259# テキストボックス1(No) 260txt_No11 = tk.Entry(width=8) 261txt_No11.place(x=30, y=80) 262 263txt_No12 = tk.Entry(width=8) 264txt_No12.place(x=30, y=110) 265 266txt_No13 = tk.Entry(width=8) 267txt_No13.place(x=30, y=140) 268 269 270# テキストボックス2(姓) 271txt_No21 = tk.Entry(width=12) 272txt_No21.place(x=110, y=80) 273 274txt_No22 = tk.Entry(width=12) 275txt_No22.place(x=110, y=110) 276 277txt_No23 = tk.Entry(width=12) 278txt_No23.place(x=110, y=140) 279 280 281# テキストボックス3(名前) 282txt_No31 = tk.Entry(width=12) 283txt_No31.place(x=220, y=80) 284 285txt_No32 = tk.Entry(width=12) 286txt_No32.place(x=220, y=110) 287 288txt_No33 = tk.Entry(width=12) 289txt_No33.place(x=220, y=140) 290 291 292# テキストボックス4(性別) 293txt_No41 = tk.Entry(width=8) 294txt_No41.place(x=330, y=80) 295 296txt_No42 = tk.Entry(width=8) 297txt_No42.place(x=330, y=110) 298 299txt_No43 = tk.Entry(width=8) 300txt_No43.place(x=330, y=140) 301 302 303# テキストボックス5(生年月日) 304txt_No51 = tk.Entry(width=12) 305txt_No51.place(x=400, y=80) 306 307txt_No52 = tk.Entry(width=12) 308txt_No52.place(x=400, y=110) 309 310txt_No53 = tk.Entry(width=12) 311txt_No53.place(x=400, y=140) 312 313no = ["1","に","3","4","5","6","7","8","9","10","11"] 314姓 = ["渡邊","柳川","清野","根本","阿部","稲田","木内","三宅","石村","本郷","山田"] 315名 = ["沙樹","和臣","菜緒","駿斗","亜依","和徳","喜雄","美南","比呂","香帆","比呂"] 316性別 = ["女","男","女","男","女","男","男","女","男","女","男","女","男"] 317生年月日 = ["1988/07/15","1966/09/04","1979/06/08","1992/03/14","1977/04/04", 318 "1963/11/06","1972/08/21","1992/11/30","1967/12/07","1965/03/20","1977/04/04"] 319pageid = 0 320pageid = 0 321hyoji(pageid) 322 323root.mainloop( ) 324 325
試したこと
各種リストを保存してみたが、保存方法が誤っているのはわかるが、どう記述すべきか、
わからない。
読み込みに至っては見当もつかない。
使用法
クリアボタン・・・全エントリー内の内容を消去する
読み込み ・・・CSV形式で書かれたファイルを読み込み、リストを上書きする予定
保存 ・・・上書きされたリストを読み込み、CSV形式でファイル書く予定
前ボタン、次ボタン ・・・ページをめくる機能
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。