みなさんこんにちは。 システム開発課の丸野です。
みなさんは、普段仕事をしている時に、簡単なGUIツールを作りたいと思うことはないですか? 例えば、
- コマンドラインで使える便利なツールを作ったけど、非エンジニアの部署に広められない
- フリーソフトやクラウドベースのツールの利用が禁止されている
- TUIでは視認性に問題がある
みたいなケースは、よくあるのではないでしょうか?
今回の記事ではこれらの問題の解決のため、Pythonで書けるお手軽なGUIフレームワーク、 「Flet」を紹介させていただきます。
Fletとは?
Fletは、簡潔に表現するならば、「Pythonだけで書けるFlutterベースのGUIフレームワーク」です。
Pythonで書けるGUIフレームワークは、「Tkinter」や「PySimpleGUI」などが存在しますが、Fletには様々な魅力があります。
Fletの魅力
クロスプラットフォーム対応
Fletは以下のプラットフォームにおいて、ほとんど同じコードで動作します。
- Linux、Mac、Windows
- Webアプリ
- Flet内蔵のWebサーバーを利用
- FastAPIを利用したアプリケーション
- WASMを利用したアプリケーション
- PWAアプリ
- iOS
- Android
ここまで多くのプラットフォームに単一のコードで対応できるフレームワークは、なかなか存在しないのではないでしょうか。 作ってみた物が、実際どれくらい需要があるのかははっきりとわからない場合も多いかと思います。 もしかすると急にモバイル対応が必要になるかもしれません。そういうことを考えると、このように多くのプラットフォームにすぐに適用できることは、とても魅力的な特徴と言えるでしょう。
マテリアルデザインを採用
先述の通り、Pythonには様々なGUIフレームワークが存在しますが、Pythonそのものの歴史の長さ(実はPythonはJavaよりも古い)もあってか、昔ながらの見た目になりがちです。
Fletではマテリアルデザインが採用されており、特に意識をしなくても非常にモダンな見た目に仕上がります。
どういった見た目になるのかは、ぜひFlet公式サイトのGallaryを確認してみてください。
ホットリロードに対応
GUIアプリケーションの開発では、見た目が想定通りになっているかをシームレスに確認できることは非常に重要です。 そのため、書いたコードをコンパイルする必要があったり、コマンドを実行し直す必要があったりなどの手間がかからないのは重要です。 Fletは当然のようにホットリロードに対応していますので、ファイルを保存したらすぐに反映されます。
ドキュメントが充実している
様々なGUIフレームワークで共通しているかと思いますが、基本的にはフレームワーク側で準備されているパーツを組み立ててビューを作っていくフローになると思います。 そのため、どのようなパーツが準備されていて、それぞれにどんなパラメーターやイベントが存在しているのかを細かく把握できることは重要です。 Fletは非常にドキュメントが充実しており、上記の要素はすぐに把握できるようになっています。 また、チュートリアルも大変充実しているので、作りたいアプリケーションに合わせて必要な知識をしっかりと把握することができます。
ライセンスはApache License 2.0
良いアプリケーションができ、配布したいと思ったとき、ライセンスがどうなっているかを確認することは非常に重要です。
FletのライセンスはApache License 2.0になりますので、
- 無料で利用可能 - 商用利用可能
になっています。 ほとんどの場合において、ライセンスが問題になることはないかと思いますので、この点も非常に魅力的ではないでしょうか。
開発環境を作ってみよう
Fletの魅力について、一通り述べましたので、ここからはおすすめの環境構築方法について紹介させていただきます。
Pythonをよく利用されている方はよくわかると思いますが、Pythonのインストール方法や仮想環境の管理、パッケージ管理の方法は様々な方法が存在します。
今回は、poetry
を利用して仮想環境とパッケージの管理を行う形で説明させいただきます。
まず、3.7以上、4.0未満のバージョンのPythonをインストールしてください
まだ一度もWindows環境でPythonを利用したことがない方向けに、おすすめのインストール手順を以下に記述します
python
コマンドでMS Storeが開かないようにします- スタートメニューで、「アプリ実行エイリアスの管理」と検索し、「アプリインストーラー」の項目をオフにしてください
Python公式サイトからインストーラーをダウンロードします。この時、「 Windows installer」をダウンロードしてください
インストーラーを起動し、「Use admin previleges when installing py.exe」と「Add python.exe to PATH」にチェックを入れ、「Customize installation」をクリックします。
画面を進め、「Advanced Option」の「Customize install location」でインストール先を指定します。
- あくまでも好みではありますが、パスが長くなりすぎないように、ユーザーフォルダ直下にPythonというフォルダを作成して、そこを指定することをおすすめします。
- 以上でPythonのインストールは完了です
poetry
を利用する場合、インストールします。公式サイトのインストール手順は以下になりますが、利用されているOSのパッケージマネージャーを利用するか、Windowsの場合はpipでインストールすることをお勧めします。 python-poetry.org
pipでインストールする場合は、次のコマンドでインストールできます。
python -m pip install poetry
- プロジェクトを作りたいフォルダに移動して、仮想環境を作成します
poetry init
- 色々と聞かれると思いますが、こだわりがなければEnter連打で大丈夫です
- 必要なパッケージのインストールを行います
poetry add flet
- 依存関係も含めてインストールされます
- 仮想環境のシェルに切り替えます
poetry shell
- Windows環境で以下の内容のエラーが発生した場合、
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
を実行してくださいbecause running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.
- Windows環境で以下の内容のエラーが発生した場合、
- 仮想環境にPyInstallerをインストールします
- 仮想環境を有効にした状態で、
python -m pip install pyinstaller
を実行します
- 仮想環境を有効にした状態で、
- カレントフォルダにfletのプロジェクトを作成します
flet create --template counter .
--template
オプションでテンプレートを指定することが出来ます- 現在は
minimal
とcounter
の二種類のテンプレートが存在しています - デフォルトは
minimal
になります。
- Gitがインストールされていない場合、エラーが発生することがあります
- アプリケーションを起動します
flet run -r
- ファイルの変更を行うと、すぐに反映されます(ホットリロード)
-r
オプションをつける事で、全てのサブフォルダの変更をウォッチします-w
オプションをつけることで、Webアプリとして起動できます- 生成された
main.py
の、以下の箇所を変更することで、内蔵Webサーバーで起動させることが出来ますflet.app(main)
→flet.app(target=main, view=ft.AppView.WEB_BROWSER)
flet run -r
を実行すると、ターミナルにURLが表示されるので、ブラウザからアクセスしてください
- 現在利用しているOS向けに、アプリケーションをビルドする
flet pack main.py
を実行します- Windows環境の場合、
-D
オプションを利用することで実行環境まで含めて一つのEXEファイルに出来ます
- Windows環境の場合、
- プロジェクトのルートフォルダの
/dist
に実行ファイルが生成されます - Linuxマシン上でWindows向けにビルドする、といったことをするためにはGitlab CI/CDなどを利用する必要があります
- CI/CDを構築するためのTipsですが、Poetryでは以下のコマンドを実行することでrequirements.txtを生成できます
poetry export --without-hashes --format=requirements.txt > requirements.txt
以上で環境構築は完了です。 あとは公式チュートリアルなどを参考に、あなたの素晴らしいアイデアを実装してみてください。
Fletについての所感
ここまでの記事で、ネガティブな事は触れませんでしたが、いくつかデメリットがあります
まだVer 1.0(安定版)が出ていない
まだ開発途上であり、今後破壊的な変更が発生する可能性がある
Roadmapがしばしば変更されており、期待していた機能がいつの間にかRoadmapから消えていたりする(C#対応など)
大規模な開発は難しそう
開発スタイルが確立されておらず、何も考えずに作成すると、スパゲッティコードになりがち
どうしてもネストは深くなりがちで、保守性に不安がある
公式以外のドキュメントはまだ少ない
- 日本語でアクセスできる情報は少ない
テストの仕組みはデフォルトでは準備されていないので、自前で準備する必要がある
- いわゆるE2Eテストは難しい
以上のようなデメリットもありますが、それでも非常に手軽に、「簡単なものを簡単に」作れるようになっているので、 例えばAPIを叩いてレスポンスを表示したり、何かしらのコマンドのラッパーを作るなどの簡単なGUIが欲しい時には、とても魅力的な選択肢になると思っています。