デスクトップアプリを「簡単に」作るための言語とフレームワークの選択肢
まえがき
この記事では、デスクトップアプリを作りたいけど「Web系の言語しか使ったことがない」「普段はPythonしか使わない」という人を対象に、デスクトップアプリを「簡単に」作るための選択肢を挙げていきます。
小規模なアプリを作ることを想定した選択肢であるので、本格的で大規模なデスクトップアプリが開発したい人は、.NET MAUIやXamarin(サポートは2024年5月1日で終了予定), Avalonia UIなどのフレームワークを使用することを検討してください。
Python
Pythonでデスクトップアプリケーションを作成する際の最大のメリットは、Pythonの充実したライブラリ群を利用できることです。処理のコアな部分をPythonのライブラリを使って実装している場合には、他の言語に置き換えるよりもPythonのGUIライブラリを使うのも手かもしれません。
Tkinter
TkinterはTcl/TkのうちTkの機能をPythonで扱い、GUIアプリケーションを作成できる標準ライブラリです。
PythonでGUIアプリを作成する際には真っ先に挙がる選択肢です。
標準ライブラリであるため、新たにインストールなどを行う必要はありません。
Tkinterに限らず、Pythonで作成したアプリケーションは、pyinstallerというライブラリを使うことで簡単にexe化できます。
Kivy
Kivyは、単一のコードでWindows, Linux, macOS, iOS, Androidで動作するクロスプラットフォームなアプリケーションが作成できるオープンソースなPythonライブラリです。
MITライセンスで提供されています。
他のGUIアプリ作成のためのPythonライブラリと異なり、モバイル端末向けにも対応しているため近年人気のGUIライブラリですが、アプリ作成にあたりKv言語を覚えないといけないので比較的学習コストが高いです。
PyQt
PyQtは、GUIツールキットのQtのPythonバインディングです。
PythonでのGUIアプリ開発で、Tkinterに続いて2番目に候補に挙がる選択肢かなと思います。
Qt Designerというデザインツールを使えば、アプリのUI部分をマウス操作で作成することができます。Qt Designerで作成したUIデータはPythonプログラムに変換できるので、PyQtでのUI部分の実装を効率化することができます。
PyQtはGNU General Public Licenseで提供されています。ライセンスの縛りが若干きつめです。
PySide
PySideは、PyQtと同じくQtのPythonバインディングです。
PyQtとは異なり、GNU Lesser General Public Licenseで提供されています。
QtのバインディングとしてはPyQtよりもライセンスの縛りが緩いのが特徴です。
PyQtと同様に、Qt Designerで作成したUIデータをPythonコードに変換すればUI部分の実装が効率化できます。
wxPython
wxPythonは、C++で書かれたwxWidgetsというクロスプラットフォームなウィジェットツールキットのPythonバインディングです。Windows, macOS, LinuxなどのOSに対応しています。
PySimpleGUI
PySimpleGUIは、Tkinter, Qt, wxPython, Remiをよりシンプルに使えるようにしたPyhonパッケージです。
複数のテーマが用意されていて、見た目の変更が簡単に行えます。
GUIアプリの開発は行ったことがないけど、UIの実装に手間をかけず小規模なPythonプログラムをすぐにGUI化したいのであれば検討していい選択肢だと思います。
ライセンスはLGPL3で提供されています。
Flet
Fletは、後述するFlutterの機能をPythonで使えるようにしたフレームワークです。Web, Windwos, macOS, Linux, Android, iOSに対応したクロスプラットフォームなアプリケーションの開発が可能です。
FlutterベースなのでUIデザインが比較的モダンです。
Dart言語を覚える必要がないため、すでにPythonを扱える人なら学習コストを抑えながらFlutterアプリが作成できます。
JavaScript(Node.js)
Webベースでデスクトップアプリケーションを作成する際のメリットは、すでにあるWebアプリケーションの移植が簡単であることや、シンタックスハイライトの実装が容易であること、デザインの自由度が高いことが挙げられます。その意味においては、JavaScriptによるデスクトップアプリの開発は有力な選択肢になりえます。
一方で、Webの技術を利用するため、クロスサイトスクリプティング(XSS)などの攻撃に対する脆弱性に気を払う必要があります。
Electron
Electronは、JavaScript, HTML, CSSによるデスクトップアプリケーションを作成するためのフレームワークです。ChromiumとNode.jsをベースに、Windows, macOS, Linuxで動作するクロスプラットフォームなアプリケーションを作成することができます。
Electronは、IPC(プロセス間通信)という仕組みを採用しており、アプリケーション自体の制御を行うメインプロセスと、ブラウザ側の処理を行うレンダラープロセスに機能を分離することで、セキュアな実装を実現しています。
Electronの開発では、このメインプロセスとレンダラープロセスが通信を行って動作するという構造を理解する必要があります。
Electronで開発されたデスクトップアプリケーションには、Atom, Discord, Slack, Visual Studio Codeなどがあります。
NW.js
NW.jsは、JavaScript, HTML, CSSで書かれたWebアプリケーションをデスクトップアプリケーションとして動作させるためのフレームワークです。
Electronとよく比較されますが、NW.jsはプロセス間通信を意識する必要がない、エントリーポイントがHTMLである、パッケージ化が比較的簡単といった違いがあり、導入やnode.jsライブラリへのアクセスはElectronより簡単です。
ただし、アプリケーションの堅牢性や日本語記事の充実度ではElectronに軍配が上がります。
NodeGui
NodeGuiは、JavaScriptとCSSを使ってクロスプラットフォーム(Windows, macOS, Linux)なデスクトップアプリが作れるフレームワークです。
Node.jsランタイムとQtのGUIウィジェットを統合したフレームワークであり、ChromiumベースのElectronやNW.jsとは異なり内部でブラウザを使用しません。
React NodeGuiというReactベースのバージョンも用意されています。
PHP
PHPはWebのバックエンドの処理に適した言語で、一般的にはデスクトップアプリケーション開発には用いられません。しかしながら、PHPでデスクトップアプリケーションを作成したいという需要はあり、以下のような選択肢があります。
NativePHP
NativePHPは、PHPを利用したデスクトップアプリケーションの構築を実現するための新しいフレームワークです。
HTML, CSS, JavaScriptそしてPHPを含めたクライアントサーバ方式で提供していたサービスをデスクトップアプリケーションに移植することを検討できます。
ただし、NativePHPはアルファ版であり(2023年10月9日現在)、本格運用のアプリケーションに採用するのは現実的ではありません。
PHP Desktop
PHP Desktopは、Web技術を使用してデスクトップアプリケーションを作成する方法を提供するために開発されているオープンソースプロジェクトです。
PHP Desktopには、ブラウザ、サーバ、PHPインタプリタが同梱されており、Zipを解凍してwwwディレクトリ内にPHPのプロジェクトファイルを配置しEXEを実行すれば、既存のWebアプリをあたかもデスクトップアプリのように実行することができます。
Dart
Dartは、Googleによって開発されたWebアプリやモバイルアプリ開発向けのプログラミング言語です。JavaScriptの改良言語として開発されており、JavaScriptの代替となることを目指していましたが、現在は専らFlutterでアプリ開発を行うための言語として使われています。
JavaScriptを使っている人にとっては、比較的習得しやすい言語であると考えられます。
Flutter
Flutterは、Googleが開発したクロスプラットフォームアプリケーション開発のためのフレームワークです。単一のコードでWeb, Windwos, macOS, Linux, Android, iOSなどの広いプラットフォームで動作可能なアプリケーションを開発できます。
Flutterでは、ホットリロードによってリアルタイムでコードの変更をプレビューできるので迅速な開発が可能です。
豊富なウィジェットが用意されており、カスタマイズを加えなくてもモダンなUIデザインに仕上げることができます。
Flutterで開発されたアプリにはじゃらんnetアプリ, My BMW App, Kubota Diagnosticsなどがあります。
あとがき
以上、デスクトップアプリケーションを作成するための言語とフレームワーク(ライブラリ)の選択肢でした。
この記事が技術選定のお役に立てたなら幸いです。
※この記事は、Noteで公開していたものに加筆修正を行ったものです。
Discussion