Morikatron Engineer Blog

モリカトロン開発者ブログ

PythonのGUIフレームワーク「Dear PyGui」の紹介

どうも、モリカトロン株式会社でエンジニアおじさんを営んでいる岡島です。

お仕事でプログラムを書いていると、ときどきGUIアプリケーションを作る必要が出てきてきます。 そういう場合今まではPythonのQtバインディングであるPyQtPySide(Qt for Python)を使っていたのですが、これらには

  • pip installとは別にQtのインストールが必要(インストールには割と時間がかかる)
  • 高機能で色々なことが出来る反面、覚えないといけないことが多い(すぐに忘れるので都度調べることになる)

という不満がありました。ちょっとしたGUIアプリケーションを作るなら、シンプルで簡単に使えるフレームワークが良い…
(Pythonに標準搭載されているtkinterもちょっと苦手です)

ということで今回は最近使い始めたGUIフレームワーク「Dear PyGui」を紹介します。

Dear PyGuiとは

ゲーム業界界隈だと知っている人も結構多いC++向けのGUIフレームワーク「Dear ImGui」のPython版がDear PyGuiです。 Dear ImGuiと同じく、プログラマーが開発用のツールなどのGUIを作成するのに適したフレームワークと言えるでしょう。

github.com

日本語の紹介記事を探してもあまり見つかりませんが、GitHubリポジトリのスター数は5,000を超えていますし、TryolabsのTop Python libraries of 2020にも選ばれているようなので、誰も使っていないマイナーフレームワークという訳でもありません。安心して使って良さそうですね。 tryolabs.com

使い方/始め方

最初は日本語紹介記事がほとんど無くてちょっと心配だったんですが、フレームワーク自体も公式ドキュメントもシンプルで分かりやすく作られているので全く困りませんでした。

インストール

GitHubのREADMEにある通り、pip install dearpygui で一発です。

最初の一歩

インストールが完了したら、公式ドキュメントのExamples に機能ごとのサンプルコードが用意されているので、まずはこれを写経したり、改変してみましょう。

github.com

Dear PyGuiのExamplesは実行結果の画像をクリックしたらサンプルコードが表示されるという構成になっていて、個々のサンプルプログラムはどれもシンプルで短いです。 なのでPythonが読み書きできれば、自然言語が不得意な方でも容易に理解できるんじゃないでしょうか。

わからないことがあったら

あたりまえですが、公式のドキュメントを読みましょう。

github.com

こちらはExamplesと違い英語で書かれていますが、トップページ以外は文章の量が少なく画像とサンプルコードを交えて簡潔に説明するようになっています。
このドキュメントとAPIリファレンスを片手にExampleのコードを弄っていれば、すぐに「Dear PyGui完全に理解した」と言えるレベルに到達するでしょう。

ムチャクチャ良く出来たドキュメントなので、技術者向けのドキュメントを書く際の参考にしたい!

Tips

「簡単に使えます。おしまい。」では寂しすぎるので、自分が触っていて気づいたことをいくつか紹介します。

日本語の表示

何も考えずにDear PyGuiで日本語を表示させようとすると文字化けします。
これについては公式ドキュメントで触れられており、Dear PyGuiが日本語に対応していないわけではなく、デフォルト設定が英語なので表示できないというだけみたいです。

github.com

上記リンクの通り、日本語フォントを add_additional_font 関数で追加して、第三引数に "japanese" を指定すれば日本語も表示できるようになります。
無料で利用できる日本語フォントは例えばGoogle Fontsで配布されていますので、ダウンロードしてプログラムの最初で add_additional_font しておくようにすると良いでしょう。

OS標準のファイルダイアログを使用する

Dear PyGuiは特定のOSの機能を利用しません。そのため、標準で用意されているファイルダイアログは以下のような独自実装のダイアログになっています。

f:id:morika-okajima:20210507120101p:plain

個人的にはこれはちょっと使いにくい…… 使い慣れたOS標準のダイアログが恋しくなります。

そこで、僕は以下のようにPython標準のGUIフレームワークであるtkinterのファイルダイアログを利用するようにしています。
(冒頭で書いた通りGUIすべてをtkinterで書くのは嫌だけど、このくらいならアリかな。)

ファイルを開きたい場合なら…

import tkinter
import tkinter.filedialog as filedialog
 
root = tkinter.Tk()
root.withdraw()  # ルートウィンドウを非表示に設定
file_path = filedialog.askopenfilename()
root.destroy()  # 非表示になっているtkinterのウィンドウを削除する

のように、ファイルダイアログを呼び出すときにだけtkinterを使うことで、Dear PyGuiで作ったGUIからOS標準のファイルダイアログを呼び出します。

GitHub にもサンプルプログラムを用意しておきますので、そちらもご確認ください。

github.com

pyinstallerで実行可能ファイルを作る際の注意

pythonで作ったプログラムを配布する場合、pyinstallerを使って実行可能ファイルを生成することがあります。 Dear PyGuiで作ったプログラムもpyinstallerを使って実行可能ファイルにすることが出来るのですが、Windows 環境ではちょっとだけ注意が必要でした。

--onefile オプションを使って1ファイルにまとめてしまう場合、--add-data オプションで同梱したフォントファイルが add_additional_font 関数で読み込めません。

exeに埋め込んだフォントを読み込みできないというのが理由のようです。
--onefile オプションを付けないか、別途フォントファイルを用意することで正しく動作するので、外部のフォントを利用する場合にはどちらかの方法で上記の問題を回避すると良いかと思います。

おわりに

使用を始めて一ヵ月くらい経過しましたが、今のところは不便もなく非常に便利なフレームワークだと感じています。 少ないコードで記述できるシンプルなフレームワークなので、しばらく使わなくて忘れてしまっても容易に思い出せるでしょう。(これは個人的に非常に重要なポイント)

PythonでGUIアプリケーションを作る場合にはPySideを使っている人が多いんじゃないかと思いますが、用途によってはDear PyGuiの方が適していることもあると思いますのでお手すきの際に一度試してみてはいかがでしょうか?