見出し画像

機能追加(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は、別コマンドにして、ユーザーに「自覚」しながら使ってもらう、と仕様変更することにします。

この記事が気に入ったらサポートをしてみませんか?