🐶

Python GUI(2020年末)

2020/12/18に公開約2,300字

概要

去年同じテーマでQiitaに投稿した内容を今年度版で投稿します。
今回は以下のパタンに絞って記述します。

  • Streamlit
  • Tkinter
  • Flask+Vue.js

前回は「Qt」「wxWidgets(wxPython)」について記述しましたが、とくに今年は触っていないので、記述しません。
知りたい方は以下の記事を参照してください。

本記事では、比較およびそれぞれのパタンの簡単な概要を記載します。

比較

以下に個人的な比較表を示します。これは減点式で比較結果であり、多分に個人的主張を含んでいるため、ご了承ください。難度においては、〇の方が易しいということです。

| 項目 | Streamlit | Tkinter | Flask+Vue.js |
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| 難度 | 〇 | 〇 | △ |
| 保守性 | 〇 | △ | × |
| 配布 | △ | 〇 | △ |
| 見た目 | △ | × | 〇 |
| 点数 | 6 | 5 | 4 |
(〇:2点、△:1点、×:0点)

ライブラリの使用難度はStreamlitがもっとも易しいと思います。pythonのみでWebアプリを簡単に作成できる点が良いです。私がStreamlitを知ったきっかけの動画にもありましたが、基本的にはデータ処理のビュアーとして使用するのが良いと思います。ただ、時刻同期が多いなどの状況には不適切に思います。一度、opencvと合わせてリアルタイムに画像を更新してみましたが、更新タイミングは悪くありませんが、ブラウザに割り当てられるメモリが爆増しました(jpgで画像情報を渡していて、それをブラウザで領域をとってるみたい)。

ローカル利用および少し難しいことをやらせたい場合は、個人的にTkinterが良いと考えます。こちらもpython以外の知識が必要ありませんし、python標準ライブラリという点も保守性としては優位だと考えます。日本語の記事も多く、pythonが息をしている間は選択肢の1つとして常に入れといて良いように思います。Streamlitと比べ配布しやすい点も良いと考えます。

Flask+Vue.jsは、この中ではもっとも実装するのが難しいですが、デザインを凝ったものにしたい場合は、良い選択肢だと思います。GUI部分はVue.jsやReactのようなjavascirptフレームワークで実装し、目的に合ったデザイン用フレームワーク(Bootstrapなど)を使用すると、アプリぽくなります。バックエンド/フロントエンドを分けて実装することで、保守性が上がります。また、dockerを使用すると、それっぽいWebサービスとしてdeployすることも方法としては可能です。

総括として、見た目に時間をかける必要がない場合は「Streamlit」、ローカルで使用および時刻同期が多い場合は「Tkinter」、後々サービスとして公開する前提であれば「Flask+Vue.js」ですかね。

個別解説

Streamlit

公式の直訳では、「機械学習とデータサイエンス用のwebアプリ」用のライブラリらしいです。以下のコマンドを使用すると、サンプルアプリが起動します。

Streamlit hello

個人的に良いと思った点は、フォームの実装しやすさです。また、見た目をこだわらなければ見やすいデザインをしています。複数のページ切り替えも不便はなく、自分は非Web系エンジニア用コンソールソフトを作成してみていますが、概ね良好です。

Tkinter

Python標準のGUIライブラリです。そこそこ実装しやすいです。複数の画面切り替えもコツさえ分かればでき、pyinstollerを使用すれば実行ファイルで配布できるので、非エンジニアに配る用のアプリを作成する際にはちょうどいいかもしれません。ただ、古臭い見た目が難点だと思います。

Flask+Vue.js

この中だと一番実装が面倒だと思います。ただ、フロントエンドにVue.jsを採用するので、当たり前ですが見た目の自由度は他よりも高いです。また、場合にもよりますが、このままサービスとして公開して差支えないものがそもそもできるので、そういう予定がある場合は採用を考えていいと思います。まぁ、ここの比較に入れるのは「GUI側をPythonで実装してないじゃん」という意味で邪道ですが。要するにそこまでpythonで見た目の良い画面を作るのが面倒だということだと思います。

おわりに

今年、改めて比較してみました。正直、プログラミングしている分にはGUIはそこまで重視する必要はないと考えています。それでも意外にGUIを要求される場面は多くあるわけですが。なるべくGUIの作成工数を状況に合わせて削減し、本筋の機能に注力したいものです。

Discussion

ログインするとコメントできます