実現したいこと
Tkinterのウィジェットを使って、Excelへ書き出し、読み込みを行いたい
前提
Tkinterのウィジェットを使って、特定形式のExcelの書き出し、読み込みができるコードを作成中です。
ウィジェットの作成、Excelへの書き出しまではうまくいったのですが、その書き出したデータを読み込もうとすると
下記エラーが出ます。
しかし、書き出したExcelファイルをアプリで開き上書き保存したものは、問題なく読み込めます。
なので、下記のようなTkinterのentryのエラーではない気がするのですが...
何が原因かわかりません。
わかる方がいらっしゃいましたらご協力をお願いします。
保存用関数と読み込み用関数のコードを抜粋して掲載しますが、初心者なのでおかしな箇所もあるかと思いますがご容赦ください。
発生している問題・エラーメッセージ
_tkinter.TclError: wrong # args: should be ".!frame2.!entry insert index text"
該当のソースコード
python3.9
1 def save_data(self): 2 filename1 = filedialog.asksaveasfilename(title = "名前を付けて保存", filetypes =[("xlsxファイル", "*.xlsx")]) 3 print(filename1) 4 5 if not ".xlsx" in filename1: 6 self.get_val_all(filename1) 7 self.wb.save(filename1+".xlsx") 8 self.wb.close() 9 10 elif ".xlsx" in filename1: 11 self.get_val_all(filename1) 12 self.wb.save(filename1) 13 self.wb.close() 14 else: 15 pass 16 17 18 def import_excel(self): 19 20 filename = filedialog.askopenfilename(title = "データ選択", filetypes =[("xlsxファイル", "*.xlsx")]) 21 print(filename) 22 23 imp_wb = px.load_workbook(filename,data_only=True) 24 ws = imp_wb["一時保存"] 25 pile_values = [ws["C2"].value,ws["E2"].value,ws["G2"].value] 26 27 for i,j in enumerate(self.pile_entrys,0): 28 j.insert(0,pile_values[i]) 29 30 main_bar_values = [ws["C3"].value,ws["F3"].value] 31 self.main_bar_entry1.insert(0,main_bar_values[0]) 32 self.main_bar_entry2.set(main_bar_values[1]) 33 34 hoop_bar_values = [] 35 for rows in ws.iter_rows(min_row=17, min_col=3, max_row=17, max_col=10): 36 for cell in rows: 37 hoop_bar_values.append(cell.value) 38 for i,j in zip(range(len(hoop_bar_values)),range(0,7,1)): 39 self.hoop_bar_entrys[j].insert(0,hoop_bar_values[i]) 40 41 self.hoop_bar_entry2.set(hoop_bar_values[-1]) 42 43 entry_boxs6 = [] 44 for rows in ws.iter_rows(min_row=32, min_col=3, max_row=32, max_col=8): 45 for cell in rows: 46 entry_boxs6.append(cell.value) 47 for i,j in zip(range(0,3,1),range(0,3,1)): 48 self.basket_entrys1[j].insert(0,entry_boxs6[i]) 49 self.basket_entrys1[2].set(entry_boxs6[2]) 50 for i,j in zip(range(3,6),range(4,7)): 51 self.basket_entrys1[j].insert(0,entry_boxs6[i]) 52 53 values=[] 54 sliced_values1=list() 55 56 for rows in ws.iter_rows(min_row=5, min_col=2, max_row=14, max_col=8): 57 for cell in rows: 58 values.append(cell.value) 59 60 for v in range(0,len(values),7): 61 sliced_values1.append(values[v:v+7]) 62 remove_01 = [x for x in sliced_values1 if x[1] != 0] 63 64 for i in range(len(remove_01)): 65 self.tree1.insert(parent='', index='end', iid=i ,values=remove_01[i]) 66 67 values2=[] 68 sliced_values2=list() 69 for rows in ws.iter_rows(min_row=20, min_col=2, max_row=24, max_col=7): 70 for cell in rows: 71 values2.append(cell.value) 72 73 for v in range(0,len(values2),6): 74 sliced_values2.append(values2[v:v+6]) 75 remove_02 = [x for x in sliced_values2 if x[1] != 0] 76 77 for j in range(len(remove_02)): 78 self.tree2.insert(parent='', index='end', iid=j ,values=remove_02[j]) 79
試したこと
読み込む際に、data_only=Trueのコードを消すと、エクセル自体は読み込めますが、セルの数式がそのまま読み込まれてしまいます。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
エラーがどこで発生したか分かるように全文(Traceback)を提示ください。
また、エラー発生場所でのentryにセットしようとした(セルの?)値をprintしてみた結果も提示ください。
早速ありがとうございます。Tracebackを添付します。
Traceback (most recent call last):
File "C:\Users\tko21850\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "C:\Cloud\Box\MyFolder\python\配筋\場所打ち杭\module1.py", line 357, in import_excel
j.insert(0,pile_values[i])
File "C:\Users\tko21850\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 3056, in insert
self.tk.call(self._w, 'insert', index, string)
_tkinter.TclError: wrong # args: should be ".!frame2.!entry insert index text"
セルの値をprintすると、おっしゃる通りNoneとなりますが、Excel自体にはちゃんと数字が入っています。
すなわち
Excel上で見たらA1といったセルには何らかの数字が入っているのに
data_only=Trueで読み込んだらws['A1'].valueがNoneになっている
ということでしょうか。
であれば、tkinterというよりopenpyxl上の問題なので
"C2"(あるいは"E2","G2")セルには具体的にどんな値(あるいは数式?)が入っているか?
を提示するとよいかと思います。
おっしゃる通りです。
"C2"(あるいは"E2","G2")には同エクセル内の別のシートのセルを参照する数式が入っています。
具体的には、"=構造!C2"という感じです。
もしかしてExcel上でセル値がちゃんと再計算(更新)されていないのかもしれません。