はじめに
この記事はCPS Lab Advent Calender 2021の20日目の記事です。
最近、Pythonでローカル環境で動作するexe化されたGUIアプリを作る機会がありました。GUIのイベント駆動のみでなくマルチスレッドで動作させるなどコードがややこしくなったため、Railsぐらいしか経験はありませんでしたがMVCに則って開発してみることにしました。Railsとは異なりDBがモデルに該当するわけでもないのでなんちゃってMVCかもしれませんが、モデルとビューで双方のインスタンスを作成しない原則は守れたので、今回は復習がてら簡単な電卓アプリ(乗除優先のみ対応)を作ってみました。
GUIライブラリはPySimpleGUIを使っています。ファイル構造がたかだか電卓にしては大袈裟になってしまいましたが、大規模なPythonローカルアプリを作る時の足掛かりになれば幸いです(だいたい皆さんWebアプリで作られるのであまりニーズはないかも...)。
アドカレ用の突貫コーディングです。ご容赦ください。
実行環境
使用したライブラリ
- PySimpleGUI
- pyyaml
ファイル構造
プログラムは**Github(stkhrmwl/py-gui-calculator)**に上げてあるので詳細は割愛しますが、主なファイル構造は次の通りです。
app/
- configs/
- ui_key.yml
- yaml_entry_point.py
- controllers/
- view_controllers/
- main_console_controller.py
- main_controller.py
- models/
- calculator.py
- views/
- components/
- button.py
- text.py
- styles/
- base_style.py
- button_style.py
- text_style.py
- main_console_view.py
- main.py
Pipfile
Pipfile.lock
JSフロントかぶれで view のパーツをcomponents
フォルダに入れたりしています。configs
にはUIパーツのキー情報や定数などをYamlで宣言しています。views
ではレイアウトの定義のみに留め、イベントキャッチのループ処理はcontrollers
で行っています。models
は主に電卓のロジックです。
スタイル情報をまとめたかったのでスタイルは辞書型で別ファイルで定義して、各コンポーネントのPySimpleGUIの定義クラスに**(スタイル名)
で引数を渡しています。
動作の様子
実際の動作の様子は次の通りです。やはり電卓程度だと無駄にファイル数が増えるだけであまり作業効率が向上した気はしませんでしたが、SQLiteを使用するなどモデル層が厚くなるほどMVC(とかその他諸々)のような考え方は役立つと思いました。