Thought Log

航空宇宙エンジニアの卵、もうすぐ就職

Pythonで家計簿アプリを作る その1

題名の通り、Pythonを使ってGUI家計簿アプリを三週間程度で作った話を備忘録的に書きます。開発したアプリの要点だけいうと、巷によくある家計簿アプリとほぼ同等の機能を持つことを目標にし、明細データを入力、保管、表示、変更できるプログラムを作成しました。またその明細データをもとにグラフを出力して出費傾向を可視化できるようにしました。主な使用モジュールは、

  • PyQt5でGUIを作り
  • SQLiteを使って家計簿の記録データを.dbファイルに保管し
  • PandasがSQLiteが読み取ったデータをデータフレームとして扱い
  • Matplotlibで家計簿データを可視化しました

作成したアプリの概要はこんな感じで、今回は自己紹介・開発を思い立った経緯、目標、使用環境とツールを書きます。なおソースコードはいずれGithubのレポジトリを公開すると思います。

f:id:Nullius_in_verba:20220224122345p:plain

開発中の家計簿アプリ。データはダミーデータです。

 

自己紹介・経緯

航空宇宙工学の学生として数値計算用にはかれこれ5年ほどC,C++,Python,Juliaなどをいじってきましたが、数値計算以外にはほぼ接点がなかったのでアプリ開発GUIなどは初心者。春から無事就職できるということで、2月初旬の修士論文提出後に何か暇を潰せるものはないかと思い、家計簿開発に挑戦。あくまでプログラミングの勉強という位置づけなので、少々Overkillな機能をつけたり、不必要にモジュールを入れたりしているかもですが、ご了承ください。

目標

まず、自分が一人暮らしをしている2年間使っていた家計簿アプリをご紹介します、特に機能に不満はなかったのでこれをお手本としました。

f:id:Nullius_in_verba:20220224112602p:plain

以前使っていたiOS用家計簿アプリ。

シンプル家計簿(かけいぼ) 人気おこづかい帳かけいぼ on the App Store

もう一つの(より重要な)お手本として、”Python 家計簿アプリ”で検索して最初にヒットしたmemopyさんのブログ。

memopy.hatenadiary.jp

この方のブログを読んで、①そもそもPythonで初心者でもできそうなことを把握、②単に.csvファイルなどに記録するだけでなく、.dbファイルにデータベース(DB)として保管すればSQLやDB管理の練習にもなるという発想を得ました。ソースコードもそのまま動く状態で載せてくださっているのでとても参考になりました。memopyさんのアプリは表ベースの簡素なものだったので、バックエンド(と表現するのでしょうか?DB管理方法)を継承しつつ、スマホアプリ並みのGUIと機能(カレンダーベースの表示、グラフでの可視化、検索機能、等々)を追加したものを目標としました。

(なおアプリそのものはもちろん、このブログの形式もmemopyさんから参考にさせていただいています。)

 

使用環境とツール

  • 使用マシンはMacbook Pro 2020モデル(M1チップ)
  • Windows検証用に8年ほど前のLet's Noteも使用
  • Pythonは3系統でPython 3.9.2、Anacondaの仮想環境上で動かしています
  • エディタはVS Code
  • 主な使用モジュールは前述の通り、
    • PyQt5
    • SQLite
    • Pandas
    • Matplotlib
  • ほぼ終わりかけにGitとGithubを導入
エディタ

長年CとC++のコーディングにAtomを使っていたのですが、どうも使い心地がハマらずPythonだけはAnacondaのSpyderを使っていました。(もちろんAtomほどカスタマイズできるエディタにおいてハマらないのは自分の力量不足なのですが…)このアプリ開発を試みるにあたって試しにVS Codeも使ってみたらハマったという経緯があります。ですのでエディタも初心者。

GUI

GUIに関してはPythonでは大体TKinterPyQtの選択肢があるそうで、memopyさんはTKinterを使用していますが、カスタマイズできる幅や本格度が上らしいということ、あと単純にコードコピペは面白くないという理由でPyQt5を選びました。なお2021年時点でPyQt6がリリースされていましたが、初心者としてはStackOverflow等で検索しやすい前バージョンを選びました。

DB管理

SQLiteとデータベース管理に関してはSQLの勉強として追加しました。1日10件明細があったとしても3年で約1万件ですので、まだ余裕でcsv管理できそうな気はしますが、こんなところで触れておかないと機械系エンジニアとしては触れる機会もないのであえてSQLを使います。SQLiteの選択は単にPythonについてきたからです。

Pandas

開発の本当の初期にSQLiteのクエリ結果を二重のリスト型として処理していたのですが、for loopだらけで読みにくいなぁと思った時にPandasを思い出しました。Pandasもほぼ初心者だったのですが、家計簿データをPandasデータフレームとして処理することでコードの分量も読みやすさも格段と向上しました。なおPandasがあると余計SQLiteと.dbファイルの必要性が薄れる気がしますが、勉強と割り切ってSQLiteは使用します。

GitとGithub

これに関しては数値計算系で4年も5年もコード書いてて初心者とは何事ぞと情報系の方には笑われそうですね。言い訳として自分の周りに使っている人が誰もいなかったんです。機械系エンジニアのコーディングなんてそんなものです。適当な間隔を空けてソースコードをver1とか2とか名前変えてコピペして保管していたのですが、.pyファイルが複数になり、GUI用に色々な付属ファイルが増えてきた時点で”コピペ・改名バージョン管理”を断念し、Gitを勉強するいい機会と捉えて導入しました。

 

以上、開発概要、経緯、目標と使用環境・ツールでした。次回は使用要求や基本設計など、書きたいと思います。

 

次回:Pythonで家計簿アプリを作る その2、要件定義など - Thought Log