機能追加(5) キャンセル動作のバグ
(Python学習初心者の試行錯誤・備忘録です)
気付いたバグについて。
このアプリ、最初に単語と訳語のセットをCSVで読み込むとき
ここから「LoadCSV」とやると、ポップアップが開いて
BrowseからCSVファイルを選んでOKとやると、
「今テーブルにあるデータを削除して、CSVファイルのデータを読み込む」
と言う流れでした。これはOKをクリックすれば問題なく動作していました。そして、この「読み込み」の操作はめったにやらないので問題に気が付かなかった。
その後、「データベースの切り替え」という機能をつけて頻繁に使うようになってくると、
本来これをやろうと思っていたのが、うっかり、「CSV読み込み」のメニューを開けてしまうことがあった。で「Cancel」ボタンをクリックすれば、何事もなく元に戻ると思うところです。ところが・・・
元のDBのテーブルが全部消えちゃったのですよ。Σ(・□・;)
コードを追ってみるとメインのコードのwhile True: ループの中では
elif event == "LoadCSV": #学習教材をCSVで読み込む処理、古いのは削除
mycsv = eg.popup_get_file("CSVファイルを選択",
file_types=(("All Files", "*.*"), ("CSV Files", "*.csv"), ))
mycontroller.loadcsv(mycsv)
mycontroller.pickupcard(value["-LEVEL-"])
mycontroller.refresh_view(myview)
とやっている。popupでキャンセルした場合はCSVファイル名を想定している mycsvには 何が入るか・・
ここの公式の説明を見ると
WIN_CLOSED ( None ) が返るということですね。ではこの状態で
mycontroller.loadcsv(mycsv)
を呼び出すと・・ Controllerクラスの中で
def loadcsv(self, csvfilename:str) -> None:
self.mycards.clear_table()
self.mycards.loadfromcsv(csvfilename)
csvfilenameの如何を問わず、clear_table() を呼び出していました。まあ、これだとまず、データが消えてしまうのは当たり前でしたね。消したうえで
self.mycards.loadfromcsv(csvfilename)
で、ファイル名が無いからエラーになるけれど、その時点ではテーブルの中身はもう残っていない。
頑張って学習中だったデータが全部消えたら、学習者の喪失感は半端ないですね。clear_tableは安易に使うべきコマンドではないな。
対策
これまでと同じ発想での案としては、popupの返り値がWIN_CLOSED ( None )だった場合の処理を分ける、と言うやりかたもあるでしょう。
ですが、clear_tableというのが既存のデータを失う「非常に危ない操作」だと言うことを踏まえると、loadcsv の中で勝手に実行(削除)してしまわず、ユーザーに意識したうえで実行してもらう方がよさそうです。
そこで、LoadCSVでは元のテーブルの中身を削除せず、新たなデータを「追加」するだけ、clear_tableは、別コマンドにして、ユーザーに「自覚」しながら使ってもらう、と仕様変更することにします。
この記事が気に入ったらサポートをしてみませんか?