こんばんは。ざわです。
Pythonで実装したツールで、画面の一覧データをCSVファイルに出力したら
頭に0(ゼロ)がついているデータの 0部分がゼロ落ちして出力される現象がありました。
GUIにtkinter、一覧(表)は tkinter.ttk.Treeview ウィジェットを使っています。
原因など調べてみた結果と対応策について書いていきたいと思います。
現象
ゼロ落ち現象となるサンプルコードはこちらになります。
これを実行した画面がこちら。
CSV出力した結果がこちら。
画面の表のID列には コードの29~31行目のレコード追加処理で書いた通り 0がついた状態で表示されていますが、
CSVには 0が消えて出力されています。
ただ、CSVの3行目のように 数値以外の文字が含まれる場合はゼロ落ちしていません。
対応方法
さて、何が原因でどう修正したらいいかなと調べた結果、こちらのサイトが参考になりました。
(フォーマットして0埋めしたら?というご意見もあると思いますが桁数が固定でないためフォーマットでは対処できず・・)
それに該当するのが ttkの _convert_stringval()関数(*1)のようです。
参考サイトでは、
自身のコードに、条件文によって整数に変換しない _convert_stringval()関数を実装し、
ttk._convert_stringvalをその関数で置き換えるようにしています。(*2)
*1:ttk.py の元の関数
ttk.py はPythonのインストール先の tkinterフォルダにあります。
(例 : C:\Users\{ユーザID}\AppData\Local\Programs\Python\Python310\Lib\tkinter)
*2:上記のサンプルコードに _convert_stringval()関数を追加した例
6~14行目に _convert_stringval()関数を追加しています。
(この関数は、ttkのimport後、ttk.Treeviewを使用するコードより前に追加すること)
8行目の if文が元関数から変更(追記)したコードになります。
16行目で ttk._convert_stringval を自身の関数で置き換えています。
これを実行してCSV出力した結果がこちら。
ID列のデータがゼロ落ちせず、正しく出力されるようになりました。
ここまで、ttk._convert_stringval()関数を変更する方法を書いてきましたが、
他のコードに影響を及ぼしそうでttkの関数を変更したくない、という場合もあるかと思います。
そういった場合の対応案として、Treeviewにinsertする時点でデータを pandasのDataFrameにセット(保持)しておき、
CSV出力処理時に Treeviewから出力データを取得するのではなく、保持したDataFrameデータを出力すればいいかと思います。
それではまたー。
0 件のコメント:
コメントを投稿