🐶

Python GUI(2020年末)

2020/12/18に公開

概要

去年同じテーマで 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