LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.

More than 1 year has passed since last update.

posted at

updated at

MVCを意識して電卓を作った(Python)

はじめに

 この記事は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(とかその他諸々)のような考え方は役立つと思いました。

test.gif

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up