DearPyGuiの使い方|pipでのインストールから日本語表示・画面の作り方まで
ニンジンです🥕
今回は、PythonでGUIアプリを作れるライブラリ「DearPyGui」の使い方をまとめました。
DearPyGuiは2024年に2.0が出てから書き方がいくつか変わっていて、ネットの記事やAIが書くコードには古い書き方がまだ多く混ざっています。実際、この記事を書くためにAIと一緒にテンプレートを作っていたら、ウィンドウのタイトルを日本語にしただけで、Windowsでエラーも出さずにアプリが落ちるという現象にぶつかりました(詳しくは次回の記事で書きます)。
この記事は、2026年9月時点の最新版 2.3.1 を、Windows 11で実際に動かして確認した内容だけで書いています。
目的別の読み方
- とりあえず動かしたい人 → 「2. インストール」「3. 最小のコードでウィンドウを出す」
- 日本語が「????」になって困っている人 → 「4. 日本語が「????」になるときの対処」
- ボタンや入力欄の置き方を知りたい人 → 「5. DearPyGuiの基本部品の使い方」
確認環境
- Windows 11 25H2
- Python 3.13.13(64bit)
- dearpygui 2.3.1
この記事で使った見本コード(3章・4章の hello.py / hello_japanese.py と、5章の6本)は、まとめてダウンロードできます。
📦 dearpygui001-examples.zip をダウンロード(hello.py / hello_japanese.py / 01_text.py 〜 06_container.py / README.txt)
1. DearPyGuiとは(tkinter・PyQtとの違い)
DearPyGuiは、C++のGUIライブラリ「Dear ImGui」をPythonから使えるようにしたものです。ライセンスはMITで、Windows・Mac・Linuxで動きます。
ボタンや入力欄をOSの部品を借りずに自前で描いているのが特徴で、Windowsでは DirectX 11 を使って画面を描いています。そのため、OSが違っても見た目がほぼ同じになります。
よく比べられるtkinterやPyQtとの違いは、ざっくり次のとおりです。
- tkinter:Pythonに最初から入っているので、インストール不要
- PyQt:部品が豊富で、本格的なアプリ向け
- DearPyGui:pipでのインストールが必要。グラフ(プロット)や表の機能が最初から入っている。見た目はWindows標準のアプリらしくはならない
もう1つ、DearPyGuiは日本語を表示するのに自分でフォントを指定する必要があります。これは4章で説明します。
tkinterを見た目だけモダンにしたい場合はCustomTkinter、スマホアプリまで視野に入れるならFletという選択肢もあります。どちらも別の記事で紹介しています。
2. DearPyGuiのインストール(pip install dearpygui)
コマンドプロンプトで次のコマンドを実行します。
py -m pip install dearpygui==2.3.1Successfully installed dearpygui-2.3.1 と出れば成功です。途中に出ている [notice] はpip本体の更新のお知らせなので、気にしなくて大丈夫です。
入ったバージョンは、次のコマンドで確認できます。
py -c "import dearpygui; print(dearpygui.__version__)"バージョンを指定する理由
==2.3.1 を付けずに pip install dearpygui でもインストールはできます。ただ、DearPyGuiはバージョンによって書き方が変わるので、この記事と同じ2.3.1に合わせておくと安心です。
「インストールしたのに No module named ‘dearpygui’」になる場合
私はここでつまずきました。コマンドプロンプトではちゃんと動くのに、VS Codeの▶ボタンで実行すると ModuleNotFoundError: No module named 'dearpygui' になります。PCを再起動しても変わりませんでした。
原因は、パソコンにPythonが2つ入っていたことです。
pyコマンドが使うPython:C:\Users\(ユーザー名)\AppData\Local\Programs\Python\Python313\python.exe- VS Codeが使っていたPython:
C:\Users\(ユーザー名)\AppData\Local\Microsoft\WindowsApps\python3.13.exe(Microsoft Store版)
DearPyGuiは前者に入っているので、後者から実行すると見つかりません。VS Codeで Ctrl+Shift+P →「Python: インタープリターを選択」を開き、前者のPythonを選べば直ります。
py が使っているPythonの場所は、次のコマンドで確認できます。
py -c "import sys; print(sys.executable)"なお、Windows向けのDearPyGui 2.3.1が用意されているのは、64bit版のPython 3.8〜3.14だけです。
3. 最小のコードでウィンドウを出す(create_context〜start_dearpygui)
まずは文字を表示するだけのアプリです。hello.py という名前で保存して実行してください。
import dearpygui.dearpygui as dpg
dpg.create_context() # 1. 準備
with dpg.window(tag="main"): # 2. 画面の中身を作る
dpg.add_text("Hello, DearPyGui!")
dpg.add_text("こんにちは")
dpg.create_viewport(title="Hello", width=400, height=200) # 3. OSのウィンドウを作る
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.set_primary_window("main", True) # 4. main をウィンドウいっぱいに広げる
dpg.start_dearpygui() # 5. 閉じるまでここで動き続ける
dpg.destroy_context() # 6. 後片付けDearPyGuiのプログラムは、いつもこの順番で書きます。
create_context()で準備するwith dpg.window():の中に、ボタンや文字などの部品を書くcreate_viewport()→setup_dearpygui()→show_viewport()でOSのウィンドウを作って表示するset_primary_window()で、2で作った画面をウィンドウいっぱいに広げるstart_dearpygui()で動かす(ウィンドウを閉じるまで、ここから先には進みません)destroy_context()で後片付けをする
DearPyGuiでは、OSのウィンドウを「ビューポート」、その中に置く画面を「ウィンドウ」と呼びます。名前が似ていてややこしいのですが、create_viewport() の title がタイトルバーに出る文字です。
title="テスト" のように日本語を入れると、Windowsではウィンドウが出ないまま、エラーも出さずに終了します。PowerShellで echo $LASTEXITCODE を実行すると -1073741819 と表示されました。画面の中の文字は日本語で大丈夫です。原因を突き止めるまでの話は、次回の記事で詳しく書きます。4. 日本語が「????」になるときの対処(add_font・bind_font)
DearPyGuiに最初から入っているフォントには日本語の文字がありません。Windowsに入っている日本語フォントを登録して使います。
import dearpygui.dearpygui as dpg
dpg.create_context()
# ここを追加:日本語フォントを登録して、アプリ全体に使う
with dpg.font_registry():
font = dpg.add_font(r"C:\Windows\Fonts\YuGothM.ttc", 18) # 游ゴシック、18px
dpg.bind_font(font)
with dpg.window(tag="main"):
dpg.add_text("Hello, DearPyGui!")
dpg.add_text("こんにちは")
dpg.create_viewport(title="Hello", width=400, height=200)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.set_primary_window("main", True)
dpg.start_dearpygui()
dpg.destroy_context()with dpg.font_registry():
font = dpg.add_font(r"C:\Windows\Fonts\YuGothM.ttc", 18) # 游ゴシック、18px
dpg.bind_font(font)add_font() でフォントファイルと文字の大きさを指定し、bind_font() でアプリ全体に使うように設定します。Windowsのフォントは C:\Windows\Fonts にあります。この記事では游ゴシックの YuGothM.ttc を使っています。拡張子が .ttc のファイルも、そのまま指定して大丈夫でした。
古い記事の add_font_range_hint は不要です
ネットの記事やAIのコードでは、次のように書かれていることが多いと思います。
with dpg.font(r"C:\Windows\Fonts\meiryo.ttc", 18) as font:
dpg.add_font_range_hint(dpg.mvFontRangeHint_Japanese)2.2以前ではこの add_font_range_hint がないと日本語が ???? になっていましたが、2.3からは文字の範囲が自動で読み込まれるようになり、この関数は何もしなくなりました。書いてもエラーにはならず、ターミナルに DeprecationWarning が出るだけです。この件は、2.2と2.3.1の比較画像と一緒に、次々回の記事で詳しく書きます。
なお、絵文字(🥕など)は游ゴシックに含まれていないので、? と表示されます。
5. DearPyGuiの基本部品の使い方
ここからは部品ごとの使い方です。見本は6本あり、どれもそのまま実行できます(冒頭の dearpygui001-examples.zip に入っています)。
この章のコードは、見やすくするために4章の「フォントの登録」と、最後の「ビューポートを作って動かす」部分を省いています。省いた部分は4章のコードと同じで、次のような形になります。
import dearpygui.dearpygui as dpg
dpg.create_context()
# (4章の日本語フォントの登録)
# ↓ここに各節のコードを入れる
dpg.create_viewport(title="Sample", width=560, height=420)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.set_primary_window("main", True)
dpg.start_dearpygui()
dpg.destroy_context()5-1. 文字を表示する(add_text・add_separator)
with dpg.window(tag="main"):
dpg.add_text("ふつうの文字")
dpg.add_text("色付きの文字", color=(255, 180, 80)) # (R, G, B)
dpg.add_text("箇条書きの文字", bullet=True)
dpg.add_text("wrap を指定すると、指定した幅(ピクセル)で自動的に折り返します。"
"長い説明文を表示するときに使います。", wrap=300)
dpg.add_separator() # 区切り線
dpg.add_separator(label="見出し付きの区切り線")
dpg.add_text("tag を付けておくと、あとから中身を書き換えられます", tag="msg")
dpg.set_value("msg", "set_value で書き換えました")文字は add_text() で表示します。color で色(赤・緑・青を0〜255で指定)、bullet=True で箇条書きの「・」、wrap で折り返す幅(ピクセル)を指定できます。日本語は単語の区切りでは折り返されないので、画像のように「折り/返します」と途中で切れることがあります。
add_separator() は区切り線で、label を付けると見出し付きになります。
tag について
部品に tag="msg" のように名前を付けておくと、あとからその名前で部品を操作できます。dpg.set_value("msg", "…") で表示している文字を書き換えられます。このあとの節でも何度も出てきます。
5-2. ボタンを押して処理を動かす(add_button・callback)
count = 0
def on_click(sender, app_data, user_data):
# sender: 押された部品の tag / app_data: ボタンでは None / user_data: 自分で渡した値
global count
count += 1
dpg.set_value("result", f"{count}回押されました(sender={sender}, user_data={user_data})")
with dpg.window(tag="main"):
dpg.add_button(label="押してね", callback=on_click, tag="btn_a", user_data="Aボタン")
dpg.add_button(label="大きいボタン", width=200, height=40,
callback=on_click, tag="btn_b", user_data="Bボタン")
dpg.add_button(label="小さいボタン", small=True, callback=on_click,
tag="btn_c", user_data="Cボタン")
dpg.add_text("まだ押されていません", tag="result")ボタンは add_button() で作り、押したときに動かす関数を callback に渡します。width と height で大きさを、small=True で小さいボタンにできます。
callback に渡した関数には、次の3つが自動で渡されます。
| 引数 | 中身 |
|---|---|
sender | 操作された部品の tag(例:btn_c) |
app_data | 部品の値(ボタンの場合は None) |
user_data | 部品を作るときに user_data= で渡した値 |
画像は「小さいボタン」を押したところで、sender と user_data にそのボタンのものが入っています。1つの関数を複数のボタンで使い回して、user_data で処理を分けることができます。
5-3. 文字や数値を入力する(add_input_text・add_input_int・get_value)
def show_values(sender, app_data, user_data):
# 入力された値は get_value(tag) で読み出す
name = dpg.get_value("name")
age = dpg.get_value("age")
memo = dpg.get_value("memo")
dpg.set_value("result", f"名前: {name} / 年齢: {age}({type(age).__name__}) / メモ: {len(memo)}文字")
with dpg.window(tag="main"):
# label は入力欄の右側に表示される(左側に出す方法は 05_layout.py)
dpg.add_input_text(tag="name", label="名前", hint="名前を入力", width=250)
dpg.add_input_text(tag="password", label="パスワード", hint="パスワード",
password=True, width=250)
dpg.add_input_int(tag="age", label="年齢(0〜120)", default_value=20,
min_value=0, max_value=120,
min_clamped=True, max_clamped=True, width=250)
dpg.add_input_text(tag="memo", label="メモ", multiline=True, width=400, height=80,
default_value="複数行の入力欄です")
dpg.add_button(label="入力内容を表示", callback=show_values)
dpg.add_text("", tag="result")文字の入力は add_input_text()、整数の入力は add_input_int() です。
hint:何も入力されていないときに薄く表示される説明(add_input_intにはありません)password=True:入力した文字を*で隠すmultiline=True:複数行の入力欄にするmin_value/max_value:数値の範囲。min_clamped=True/max_clamped=Trueを付けると、範囲外の値が丸められます
画像は、年齢に200と入力して「入力内容を表示」を押したところです。上限の120に丸められていて、get_value() で読み出した値は int(整数)になっています。
入力された値は dpg.get_value("tag名") で読み出します。
5-4. チェックボックス・ラジオボタン・コンボボックス・スライダー・リストボックス
def on_change(sender, app_data, user_data):
# 選択系の部品は、変更後の値が app_data に入ってくる
dpg.set_value("result", f"{sender} → {app_data!r}({type(app_data).__name__})")
with dpg.window(tag="main"):
dpg.add_checkbox(label="通知を受け取る", tag="notify", callback=on_change)
dpg.add_radio_button(items=["小", "中", "大"], default_value="中", horizontal=True,
tag="size", callback=on_change)
dpg.add_combo(items=["りんご", "みかん", "ぶどう"], default_value="りんご", width=200,
tag="fruit", callback=on_change)
dpg.add_slider_int(default_value=50, min_value=0, max_value=100, width=200,
tag="volume", callback=on_change)
dpg.add_listbox(items=["東京", "大阪", "名古屋", "福岡"], num_items=4, width=200,
tag="city", callback=on_change)
dpg.add_text("部品を操作すると、ここに値が出ます", tag="result")| 部品 | 関数 | app_data に入る値 |
|---|---|---|
| チェックボックス | add_checkbox() | True / False |
| ラジオボタン | add_radio_button() | 選んだ項目の文字列(例:'大') |
| コンボボックス | add_combo() | 選んだ項目の文字列(例:'みかん') |
| スライダー | add_slider_int() | 整数(例:76) |
| リストボックス | add_listbox() | 選んだ項目の文字列(例:'名古屋') |
選択肢は items にリストで渡し、最初に選ばれている項目を default_value で指定します。ラジオボタンは horizontal=True で横並びに、リストボックスは num_items で表示する行数を指定できます。
5-5. 部品を横に並べる・位置をそろえる(group・spacer・table)
with dpg.window(tag="main"):
# 何も指定しなければ、上から順に縦に並ぶ
dpg.add_button(label="縦1")
dpg.add_button(label="縦2")
# group(horizontal=True) の中は横に並ぶ
with dpg.group(horizontal=True):
dpg.add_button(label="横1")
dpg.add_button(label="横2")
dpg.add_button(label="横3")
dpg.add_spacer(height=15) # 縦の余白
dpg.add_text("indent で字下げ", indent=30)
dpg.add_separator(label="ラベルの位置")
# label を付けると、部品の「右側」に表示される
dpg.add_input_text(label="名前", width=200)
# 左側に項目名を出したいときは、add_text と横並びにする
with dpg.group(horizontal=True):
dpg.add_text("名前")
dpg.add_input_text(width=200)
# 項目名の長さがバラバラでも入力欄の位置をそろえたいときは、
# 枠線なしのテーブルを使う(1列目の幅を固定する)
with dpg.table(header_row=False):
dpg.add_table_column(width_fixed=True, init_width_or_weight=130)
dpg.add_table_column()
for item in ["氏名", "メールアドレス"]:
with dpg.table_row():
dpg.add_text(item)
dpg.add_input_text(width=200)部品は、書いた順に上から縦に並びます。横に並べたいときは with dpg.group(horizontal=True): の中に書きます。add_spacer(height=15) で縦の余白、indent=30 で字下げができます。
ラベルは右側に出る
add_input_text(label="名前") のように label を付けると、項目名は入力欄の右側に表示されます。tkinterなどに慣れていると戸惑うところです。左側に出したいときは、add_text() と入力欄を group(horizontal=True) で横に並べます。
項目名の長さがバラバラなときは、テーブルでそろえる
「氏名」と「メールアドレス」のように項目名の長さが違うと、横並びにしただけでは入力欄の位置がガタガタになります。AIと見本を作っていたときは、最初に項目名を group(width=130) で包む書き方が出てきたのですが、実際に表示すると位置はそろいませんでした。
枠線のないテーブルを使い、1列目の幅を width_fixed=True で固定すると、画像のようにきれいにそろいます。
5-6. タブ・枠・折りたたみで部品をまとめる(tab_bar・child_window・collapsing_header)
with dpg.window(tag="main"):
with dpg.tab_bar():
with dpg.tab(label="基本設定"):
# child_window: 枠で囲んだ領域。高さを超えるとスクロールする
with dpg.child_window(height=120, border=True):
for i in range(10):
dpg.add_text(f"枠の中の{i + 1}行目")
# collapsing_header: クリックで開閉できる見出し
with dpg.collapsing_header(label="詳細設定(クリックで開閉)", default_open=True):
dpg.add_checkbox(label="自動保存する")
dpg.add_checkbox(label="起動時に更新を確認する")
with dpg.tab(label="その他"):
dpg.add_text("タブを切り替えると、別の画面を表示できます")
tab_bar()とtab():タブで画面を切り替えるchild_window():枠で囲んだ領域。中身がheightを超えるとスクロールバーが出るcollapsing_header():クリックで開閉できる見出し。default_open=Trueで最初から開いた状態になる
どれも with の中に書いた部品がその中に入ります。
6. DearPyGuiのテンプレートを配布します(メモ帳アプリ・AI_RULES.md付き)
ここまでの内容を1つにまとめた、メモ帳アプリのテンプレートを作りました。
できること
- 日本語フォントの設定(游ゴシック → メイリオ → MSゴシックの順に探す)
- 入力欄に書いてEnterか「追加」ボタンで、表に行を追加
- 「保存」ボタンか Ctrl+S で
memo.txtに保存(UTF-8)
- 古いバージョンのDearPyGuiで実行したら、理由を表示して止まる
- タイトルに日本語が入っていたら、落ちる前に理由を表示して止まる
- ボタンなどの処理でエラーが起きたら、画面の下に赤字で表示する(DearPyGuiは処理の中でエラーが起きてもアプリが止まらないので、気づけるようにしています)
できないこと
保存したファイルの読み込み、行の編集・削除、ファイル選択ダイアログ、グラフ、色の変更、exe化などは入れていません。必要に応じて足していく土台として使ってください。
AIに機能を追加してもらうときは
フォルダに AI_RULES.md を入れています。AIに app.py と一緒に渡して「このルールと app.py の書き方に従って〇〇を追加して」と頼むと、古い書き方が混ざりにくくなります。
AIが書いたコードは、check_old_api.py で確認できます。
py check_old_api.py古い書き方や、日本語タイトルのように落ちる書き方が見つかると、その行と直し方を表示します。
テンプレートは GitHub で公開しています。
📦 GitHubでテンプレートを見るDearPyGuiでよくある質問(FAQ)
Qpip install dearpygui したのに No module named 'dearpygui' になります
AパソコンにPythonが複数入っていて、インストールしたPythonと実行しているPythonが違う可能性があります。py -c "import sys; print(sys.executable)" でインストール先のPythonを確認し、VS Codeなら「Python: インタープリターを選択」で同じPythonを選んでください(2章)。
Q日本語が「????」になります
ADearPyGuiに最初から入っているフォントには日本語がありません。font_registry() の中で add_font() に日本語フォント(例:C:\Windows\Fonts\YuGothM.ttc)を指定し、bind_font() でアプリ全体に使ってください(4章)。
Qadd_font_range_hint(dpg.mvFontRangeHint_Japanese) は書いたほうがいいですか?
A2.3以降は不要です。文字の範囲が自動で読み込まれるようになり、この関数は何もしなくなりました。書いても DeprecationWarning が出るだけです。
Qアプリを起動してもウィンドウが出ず、エラーも出ません
Acreate_viewport() の title に日本語が入っていないか確認してください。この記事の環境(Windows 11・2.3.1)では、日本語のタイトルにするとエラーを出さずに終了しました。タイトルは半角英数字にしてください。
Q32bit版のPythonでも使えますか?
AWindows向けのDearPyGui 2.3.1が用意されているのは、64bit版のPython 3.8〜3.14だけです。32bit版のPythonではインストールできません。
Qボタンを押しても何も起きません
ADearPyGuiは、callback の関数の中でエラーが起きてもアプリが止まらず、ターミナルにエラーが出るだけです。まずターミナルを確認してください。配布しているテンプレートでは、エラーを画面の下に赤字で表示するようにしています。
まとめ
DearPyGuiのインストールから、日本語の表示、基本的な部品の使い方までを紹介しました。
- インストールは
py -m pip install dearpygui==2.3.1 - ウィンドウのタイトルは半角英数字にする
- 日本語は
font_registry()の中でadd_font()して、bind_font()するだけ(2.3からはadd_font_range_hintは不要) - 部品の値は
tagを付けてget_value()/set_value()で読み書きする - ラベルは右側に出る。項目名をそろえたいときはテーブルを使う
次回は、日本語のタイトルでWindowsだけアプリが無言で落ちる件について、原因を突き止めるまでの流れを書きます。
ぜひテンプレートを使って、DearPyGuiでのアプリ作りを試してみてください。
DearPyGui Series Navigation
DearPyGuiシリーズ:2.3.1で確かめた書き方と落とし穴
DearPyGuiの使い方|pipでのインストールから日本語表示・画面の作り方まで
この記事DearPyGuiで日本語タイトルにするとエラーも出さずに落ちる原因と回避策|0xC0000005【Windows・2.3.1】
→DearPyGuiのフォント設定と文字サイズの変え方|日本語が「?」になる原因と2.3の変更点
近日公開Follow me on X
本ブログの中の人「ニンジン🥕」はXやってます。新着記事はいち早くポストでお知らせしているので、見逃したくない方は @ninjin_py_vba をフォローしてみてください🥕
@ninjin_py_vba をフォロー










コメント