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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Tkinter

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

Q&A

1回答

1251閲覧

TkinterのウィジェットにExcelから読み込んだデータを表示させたい

ebiko1007

総合スコア0

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2023/04/13 06:57

実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

can110

2023/04/13 07:23

エラーがどこで発生したか分かるように全文(Traceback)を提示ください。 また、エラー発生場所でのentryにセットしようとした(セルの?)値をprintしてみた結果も提示ください。
ebiko1007

2023/04/13 07:37

早速ありがとうございます。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自体にはちゃんと数字が入っています。
can110

2023/04/13 07:55 編集

すなわち Excel上で見たらA1といったセルには何らかの数字が入っているのに data_only=Trueで読み込んだらws['A1'].valueがNoneになっている ということでしょうか。 であれば、tkinterというよりopenpyxl上の問題なので "C2"(あるいは"E2","G2")セルには具体的にどんな値(あるいは数式?)が入っているか? を提示するとよいかと思います。
ebiko1007

2023/04/13 08:08

おっしゃる通りです。 "C2"(あるいは"E2","G2")には同エクセル内の別のシートのセルを参照する数式が入っています。 具体的には、"=構造!C2"という感じです。
can110

2023/04/13 08:24

もしかしてExcel上でセル値がちゃんと再計算(更新)されていないのかもしれません。
guest

回答1

0

エラー詳細が分からないので推測ベースの回答ですが、Excelのセル値が空(None)だと提示エラーが発生します。
そのような値を設定していないか確認してください。
参考:kinterのentryウィジェットに対するinsertのエラー

なお、Excel上はセル値があるがload_workbookするとNoneである場合は

openpyxl.reader.excel.load_workbook

data_only (bool) – controls whether cells with formulae have either the formula (default) or the value stored the last time Excel read the sheet

と記載のとおり、data_only=Trueだと、最後にExcelが(計算して)保存した値を読み取ります。
よって.xlsxファイル状態によっては計算結果は表示だけで、その値が保存されていないのかもしれません。

Excel上で[F9]キー押すなどして再計算して保存すると正しく値が読み込めるかもしれません。

投稿2023/04/13 07:25

編集2023/04/13 08:24
can110

総合スコア38233

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

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

ebiko1007

2023/04/13 23:52

excelデータを一度開いて上書き保存するコードを追加したら読み込めるようになりました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問