PR

DearPyGuiで日本語タイトルにするとWindowsでエラーも出さずに落ちる件(原因調査編)

Python
DEARPYGUI GUIDE VOL.2
スポンサーリンク

DearPyGuiで日本語タイトルにすると落ちる原因と回避策

ニンジンです🥕

前回の「DearPyGuiの使い方」で予告した件です。

🥕 シリーズ第1回 DearPyGuiの使い方|pipでのインストールから日本語表示・画面の作り方まで インストール、日本語フォントの設定、ボタン・入力欄・表の置き方をまとめた入門編。 →

DearPyGuiでウィンドウのタイトルを日本語にすると、Windowsではウィンドウが出ないまま、エラーも出さずにアプリが終了します。

結論:DearPyGuiでもタイトルは日本語にできます

  • create_viewport() には半角英数字のタイトルを渡して起動する(ここに日本語を入れると落ちる)
  • 起動したあとに、Windowsの SetWindowTextW でタイトルを日本語に書き換える
  • DearPyGuiの set_viewport_title() で日本語にすると、落ちはしないものの文字化けする

コピーして使える関数は6章にあります。

この記事では、原因を突き止めるまでにやったことを順番に書きます。途中で使ったデバッグの方法は、DearPyGui以外で「何も言わずに落ちる」ときにも使えると思います。

確認環境

  • Windows 11 25H2(日本語版)
  • Python 3.13.13(64bit)
  • dearpygui 2.3.1(4章では 2.0.0〜2.3.1)

この記事で使ったスクリプトは、まとめてダウンロードできます。

📦 dearpygui002-scripts.zip をダウンロード

(crash_test.py / version_test.py / title_workaround_test.py / jp_title_demo.py / README.txt)


スポンサーリンク

1. 症状:日本語タイトルにすると何も表示されずに終わる

前回配布したテンプレートを作っている途中のことです。AIと一緒に書いた app.py を実行すると、ウィンドウが出ないまま、すぐに次の入力待ちに戻ってしまいました。

PS> py app.py
PS>

赤いエラー(Traceback)も何も出ません。起動時にメッセージを表示するようにしてみても、そのメッセージが出たあと、やはり何も言わずに終わりました。


スポンサーリンク

2. 終了コード -1073741819(0xC0000005)で初めて「落ちた」とわかる

エラーが出ないので、正常に終わったのか、途中で落ちたのかもわかりません。そこで、終了コードを見ました。PowerShellでは、直前に実行したプログラムの終了コードを $LASTEXITCODE で確認できます。

問題を最小のコードにしたのが、次の crash_test.py です。

import dearpygui.dearpygui as dpg
dpg.create_context()
dpg.create_viewport(title="テスト", width=400, height=200)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()
print("ここまで来たら正常終了")
日本語タイトルで実行したところ
▲ 日本語タイトルで実行したところ

py crash_test.py のあと echo $LASTEXITCODE を実行すると、-1073741819 と表示されました。最後の print も実行されていません。

タイトルを "test" に変えると、ウィンドウが出て、閉じると最後の print まで動き、終了コードは 0 になります。

英語タイトルで実行したところ
▲ 英語タイトルで実行したところ

-1073741819 は16進数にすると 0xC0000005 で、Windowsの「アクセス違反」(プログラムが読み書きしてはいけないメモリに触った)を表します。Pythonのスクリプトから別のプロセスとして起動すると 3221225477 と表示されることもありますが、同じものです。ネットで調べるときは 0xC0000005 で検索すると情報が見つかりやすいです。

Pythonのエラーなら必ずTracebackが出ます。それが出ないのは、落ちているのがPythonの部分ではなく、DearPyGuiの中のC++で書かれた部分だからです。


スポンサーリンク

3. 原因の切り分け(-X faulthandler と最小構成)

ここからは、実際に原因を絞り込んだ流れです。最初の時点では、タイトルが原因だとはまったく思っていませんでした。

落ちた場所を知る:-X faulthandler

C++の部分で落ちたときでも、Pythonを -X faulthandler を付けて実行すると、落ちた瞬間にPythonのどの行を実行していたかを表示してくれます。

py -X faulthandler crash_test.py

crash_test.py で実行した結果です(パスは一部省略しています)。

Windows fatal exception: access violation

Thread 0x000087e4 (most recent call first):
  <no Python frame>

Current thread 0x00007ed8 (most recent call first):
  File "C:\Users\(ユーザー名)\AppData\Local\Programs\Python\Python313\Lib\site-packages\dearpygui\dearpygui.py", line 101 in start_dearpygui
  File "...\dearpygui002-scripts\crash_test.py", line 6 in <module>
-X faulthandlerを付けて実行したところ
▲ -X faulthandlerを付けて実行したところ

1行目の access violation が、2章の終了コード 0xC0000005(アクセス違反)のことです。その下を見ると、crash_test.py の6行目 dpg.start_dearpygui() を実行している最中に落ちたことがわかります。start_dearpygui() は、ウィンドウを閉じるまで画面を描き続ける処理なので、画面を描く処理のどこかで落ちている、ということになります。

最小構成から1つずつ足していく

次に、どこまでなら動くかを調べました。

  1. 最小構成:ウィンドウに文字を1行出すだけのコード(タイトルは "diag")→ 動いた
  2. 部品を足す:app.py と同じ部品(横並びのボタン、入力欄、テーブル、キー入力など)を、起動後に1つずつ足していく → 全部足しても動いた
  3. 部品を外す:逆に app.py から、フォント・テーブル・入力欄・キー入力などを1つずつ外した8通りを試す → 8通りすべて落ちた

部品を足しても落ちず、外しても落ちるので、部品は原因ではありません。残った違いを見直すと、動いたほうはタイトルが "diag"、落ちたほうは "DearPyGui テンプレート" でした。

  1. タイトルだけ変える → 英語のタイトルは動き、日本語が入ったタイトルは落ちた

最後に、app.py のタイトルだけを英語に変えたら動いたので、原因が確定しました。


スポンサーリンク

4. どのバージョンから落ちるのか(2.0.0〜2.3.1で検証)

このブログでは「バージョンアップで静かに壊れる」話をよく書いているので、どのバージョンから落ちるのかも調べました。version_test.py は、DearPyGuiの版ごとに仮想環境を作り、日本語タイトルと英語タイトルでウィンドウを出して結果を一覧にするスクリプトです。

py version_test.py
バージョンタイトル「テスト」タイトル「Test」
2.0.0落ちる(3221225477)正常(0)
2.1.0落ちる(3221225477)正常(0)
2.1.1落ちる(3221225477)正常(0)
2.2落ちる(3221225477)正常(0)
2.3落ちる(3221225477)正常(0)
2.3.1落ちる(3221225477)正常(0)

2.x系の途中で壊れたのではなく、2.0.0からずっと落ちていました。どれも、最初の1回目の描画が終わる前に落ちています。

同じスクリプトをLinuxで動かしたところ、6つの版すべてで日本語タイトルでも正常に動きました。落ちるのはWindowsだけです。

1.x系(最終版の1.11.1)は、Windows用のパッケージがPython 3.12までしかなく、Python 3.13の環境では試せませんでした。1.x系でどうだったかは未確認です。


スポンサーリンク

5. なぜ落ちるのか(ソースコードと文字化けから確認)

ソースコードで確認したこと

DearPyGuiのソースコード(GitHubの v2.3.1、src/mvViewport_win32.cpp。行番号はv2.3.1のもので、バージョンによって変わります)を読むと、Windowsでウィンドウを作るときに、create_viewport() のタイトルを次の2か所に使っていました。

  • ウィンドウクラス名(Windowsがウィンドウの種類を区別するための内部の名前):347行目でクラス名に設定し、349行目の RegisterClassEx で登録
  • ウィンドウのタイトル:352行目、CreateWindow に渡す部分

しかも、日本語(Unicode)に対応していない古い形式のWindowsの関数に、UTF-8の文字列をそのまま渡しています。

タイトルがクラス名にも使われていることは、実機でも確認できました。version_test.py で英語タイトルのときにWindowsから読み取った結果は、タイトル・クラス名ともに Test でした。

起動したあとに日本語にすると、文字化けで済む

「作るときに渡すから落ちるのか」を確かめるために、英語のタイトルで起動したあと、DearPyGuiの set_viewport_title("テスト") で日本語に変えてみました(title_workaround_test.py のB)。

set_viewport_titleで日本語にしたところ

▲ set_viewport_titleで日本語にしたところ

落ちはしませんでしたが、タイトルは「繝・せ繝」に文字化けしました。set_viewport_title() 自体は、新しいタイトルを保存して「タイトルが変わった」という印を付けるだけです(v2.3.1の src/dearpygui_commands.h 2127行目)。変えたタイトルは、次の描画のときに mvViewport_win32.cpp の76行目でその印が確認され、78行目で日本語に対応していない SetWindowTextA に渡されます。

これは、UTF-8の「テスト」をShift_JISとして読んだときの文字化けです。「テスト」をUTF-8で表すと e3 83 86 e3 82 b9 e3 83 88 の9バイトになり、これを2バイトずつShift_JISとして読むと次のようになります。

バイトShift_JISとして読むと
e3 83繝
86 e3該当する文字がない(Windowsは「・」に置き換える)
82 b9せ
e3 83繝
881バイト余るので消える

並べると「繝・せ繝」になり、画面の表示と一致します。ソースで見た「UTF-8を日本語非対応の関数に渡している」ことが、実際の画面でも裏付けられました。

わかっていないこと

同じ日本語でも、作るときに渡すと落ち、作ったあとに変えると文字化けで済むことまではわかりました。ただ、作るときに落ちる内部の仕組みまでは確定できていません。作るときはタイトルとクラス名の両方に同じ文字列が使われるので、どちらが原因なのかは切り分けられていないためです。

なお、DearPyGuiのGitHubには、以前(1.4.0の頃)にWindowsでタイトルが文字化けするという報告があります(Issue #1667)。当時の報告は「文字化け」で、「落ちる」ではありませんでした。


スポンサーリンク

6. 回避策:SetWindowTextWで日本語タイトルを正しく出す

英語のタイトルで起動したあと、Windowsの日本語に対応した関数(SetWindowTextW)を直接呼んで書き換えると、正しく日本語が表示されました。

SetWindowTextWで日本語にしたところ

▲ SetWindowTextWで日本語にしたところ

実際のアプリで使いやすいように、関数にまとめたのが次のコードです。

"""
DearPyGui(Windows)でウィンドウのタイトルを日本語にする回避策。

create_viewport() には半角英数字のタイトルを渡して起動し、
起動直後に Windows の SetWindowTextW で日本語タイトルに書き換える。
"""
import ctypes
import os
from ctypes import wintypes

import dearpygui.dearpygui as dpg

APP_TITLE = "JpTitleDemo"      # create_viewport に渡す仮のタイトル(半角英数字)
JP_TITLE = "日本語タイトルのテスト"  # 実際に表示したいタイトル


def set_japanese_title(title: str) -> None:
    """ビューポートのタイトルを日本語にする。ウィンドウが表示されたあとに呼ぶ。"""
    if dpg.get_platform() != dpg.mvPlatform_Windows:
        dpg.set_viewport_title(title)  # Windows 以外はそのまま設定する
        return
    user32 = ctypes.windll.user32
    user32.FindWindowW.argtypes = [wintypes.LPCWSTR, wintypes.LPCWSTR]
    user32.FindWindowW.restype = wintypes.HWND
    user32.SetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPCWSTR]
    user32.GetWindowThreadProcessId.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.DWORD)]

    # DearPyGui は create_viewport のタイトルをウィンドウのクラス名にも使うので、
    # クラス名で自分のウィンドウを探せる
    hwnd = user32.FindWindowW(APP_TITLE, None)
    pid = wintypes.DWORD()
    if hwnd:
        user32.GetWindowThreadProcessId(hwnd, ctypes.byref(pid))
    if not hwnd or pid.value != os.getpid():
        print("警告: ウィンドウが見つからず、日本語タイトルにできませんでした")
        return
    user32.SetWindowTextW(hwnd, title)
    # 注意: このあと dpg.set_viewport_title() を呼ぶと、また文字化けしたタイトルに戻る


dpg.create_context()
with dpg.font_registry():
    font = dpg.add_font(r"C:\Windows\Fonts\YuGothM.ttc", 18)
dpg.bind_font(font)

with dpg.window(tag="main"):
    dpg.add_text("タイトルバーに日本語が出ていれば成功です")

dpg.create_viewport(title=APP_TITLE, width=420, height=150)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.set_primary_window("main", True)
dpg.set_frame_callback(1, lambda: set_japanese_title(JP_TITLE))  # 最初の描画で書き換える
dpg.start_dearpygui()
dpg.destroy_context()
回避策のデモ

▲ 回避策のデモ

ポイントは次の3つです。

  • create_viewport() には半角英数字の仮のタイトル(APP_TITLE)を渡す
  • 自分のウィンドウは、クラス名が仮のタイトルと同じであることを利用して FindWindowW で探す
  • set_frame_callback(1, …) で、最初の描画のタイミングで書き換える

注意点もあります。

  • 書き換えたあとに dpg.set_viewport_title() を呼ぶと、また文字化けしたタイトルに戻ります
  • APP_TITLE は、他のアプリとかぶらない名前にしてください(念のため、見つけたウィンドウが自分のものかも確認しています)
  • Windows以外では set_viewport_title() でそのまま設定します。Linuxでは動作を確認しましたが、Macは確認できていません

スポンサーリンク

7. AIのコードで再発させないために(テンプレートの対策)

AIに「〇〇アプリを作って」と頼むと、ウィンドウのタイトルに日本語を付けるのはごく自然なことです。私が今回ハマったのも、まさにそのパターンでした。

前回配布したテンプレートでは、次の3つの対策を入れています。

📦 GitHubで配布中 DearPyGui 2.x テンプレート(dearpygui-template) app.py・AI_RULES.md・check_old_api.py に、日本語タイトルで落ちないための対策入り。 →
  • app.py:タイトルに日本語が入っていたら、落ちる前に理由を表示して止まる
  • AI_RULES.md:AIに渡すルールに「タイトルは半角英数字」を入れている
  • check_old_api.py:create_viewport(title="家計簿アプリ") のような書き方を見つけて知らせる

スポンサーリンク

DearPyGuiの日本語タイトルでよくある質問(FAQ)

Q英語のタイトルなら問題ありませんか?

Aはい。この記事で試した2.0.0〜2.3.1のすべての版で、英語のタイトル("Test")は正常に動き、終了コードは 0 でした。

Qset_viewport_title() で日本語にすればいいのでは?

A起動後に set_viewport_title() で日本語にすると、落ちはしませんが「繝・せ繝」のように文字化けします。正しく表示したいときは、6章の SetWindowTextW を使う方法にしてください。書き換えたあとに set_viewport_title() を呼ぶと、また文字化けに戻る点にも注意が必要です。

QMacやLinuxでも落ちますか?

ALinuxでは、2.0.0〜2.3.1の6つの版すべてで、日本語タイトルでも正常に動きました。Macは確認できていません。

Q1.x系でも落ちますか?

A未確認です。1.x系の最終版1.11.1は、Windows用のパッケージがPython 3.12までしかなく、Python 3.13の環境では試せませんでした。なお、1.4.0の頃には「タイトルが文字化けする」という報告(GitHubのIssue #1667)があり、当時は落ちるのではなく文字化けでした。

Qエラーも出さずにアプリが落ちたときは、何を見ればいいですか?

AまずPowerShellで echo $LASTEXITCODE を実行して終了コードを確認します。-1073741819(0xC0000005)ならアクセス違反です。次に py -X faulthandler ファイル名.py で実行すると、落ちた瞬間にPythonのどの行を実行していたかがわかります(3章)。


スポンサーリンク

まとめ

  • DearPyGui 2.x(2.0.0〜2.3.1)のWindows版では、create_viewport() のタイトルに日本語を入れると、エラーを出さずに落ちる
  • 終了コードは -1073741819(0xC0000005)。Linuxでは落ちない
  • 起動後に set_viewport_title() で日本語にすると、落ちないが「繝・せ繝」のように文字化けする
  • 日本語タイトルにしたいときは、英語で起動してから SetWindowTextW で書き換える
  • 「何も言わずに落ちる」ときは、$LASTEXITCODE と -X faulthandler で手がかりがつかめる

次回は、DearPyGuiのフォント設定と文字サイズの変え方を書きます。2.2と2.3.1を同じWindowsで動かして、日本語が「?」になる原因(add_font_range_hint が何もしなくなった件)や、文字を拡大したときの違いを比較画像つきで紹介します。

同じ現象で困っている人がいたら、ぜひこの記事の回避策を試してみてください。


DearPyGui Series Navigation

DearPyGuiシリーズ:2.3.1で確かめた書き方と落とし穴

1

DearPyGuiの使い方|pipでのインストールから日本語表示・画面の作り方まで

→
2

DearPyGuiで日本語タイトルにするとエラーも出さずに落ちる原因と回避策|0xC0000005【Windows・2.3.1】

この記事
3

DearPyGuiのフォント設定と文字サイズの変え方|日本語が「?」になる原因と2.3の変更点

近日公開

ニンジン🥕アイコン

Follow me on X

本ブログの中の人「ニンジン🥕」はXやってます。新着記事はいち早くポストでお知らせしているので、見逃したくない方は @ninjin_py_vba をフォローしてみてください🥕

@ninjin_py_vba をフォロー

この記事が役に立ったら、シェアしてもらえると嬉しいです🥕

Xでポスト はてブ LINE Pocket
まとめハブ
Python
スポンサーリンク

コメント