以下の内容はhttps://error-daizenn.hatenablog.com/entry/2025/11/01/225426より取得しました。


【Python 3.13 × ttkbootstrap】exe化後に出る「_tkinter.TclError: invalid command name ::msgcat::mcmset」の原因と対処法 2025年11月1日公開


はじめに

PythonでGUIアプリを作成して配布する際、よくある落とし穴の一つが「exe化後のTcl/Tk関連エラー」です。
特に ttkbootstrap(Tkinterをモダンデザイン化するライブラリ)を使っている場合、
ローカルでは動作しても、別の環境やネットワークドライブ上で起動すると突然クラッシュすることがあります。

今回のエラーはまさにその典型例。

_tkinter.TclError: invalid command name "::msgcat::mcmset"

 

Python 3.13環境でこのメッセージが出た場合、
Tcl/Tkの「msgcat」モジュールが見つからず、国際化メッセージ処理が初期化できない
という意味になります。

一見すると「ttkbootstrapのバグ?」と思ってしまいますが、
実際は exe化の過程で必要なTclファイルが正しくパッケージングされていない ことが原因です。

エラーの発生状況の整理

あなたの状況を時系列で整理するとこうなります。

  1. Python 3.13 + ttkbootstrap を使用してGUIアプリを作成。

  2. pyinstaller(または他のexe化ツール)でビルドして dist フォルダ内のexeを実行。

  3. 同一PC・ローカルドライブ(Cドライブ)内では正常起動。

  4. exeをネットワーク共有ドライブにコピーし、そこから起動した途端に以下のエラーが発生:

_tkinter.TclError: invalid command name "::msgcat::mcmset"

 

  1. エラー箇所は ttkbootstrap または tkinter 初期化部分(root = ttk.Window()など)。

つまり、「exeファイル自体のビルドは成功している」が、
実行環境が変わるとTkinterの内部コンポーネントが見つからない という状況です。

エラー文の意味を分解

  • _tkinter.TclError:
    → PythonからTcl/Tkライブラリを呼び出す際の実行エラー。

  • invalid command name "::msgcat::mcmset":
    → Tcl言語側のコマンドmsgcat::mcmsetが定義されていない、
      つまり 「msgcatパッケージが読み込まれていない」

Tcl/TkはGUI表示や多言語対応のために内部で .tcl スクリプトを呼び出します。
msgcat.tcl はその中でもロケール管理を行う重要なファイルですが、
exe化ツールはデフォルトではこのファイルを自動で含めません。

では、なぜ「Cドライブでは動くのに、ネットワークドライブでは落ちる」のか

Tkinterは起動時に、環境変数 TCL_LIBRARYTK_LIBRARY を参照して
tcl8.6tk8.6 フォルダ内のスクリプトをロードします。

exe化したアプリではこれらがPyInstallerによって内部にコピーされますが、
ネットワークドライブ上では以下のような現象が起こり得ます。

  • セキュリティ制限により、一部の .tcl スクリプトが読み込めない

  • 相対パス解決が失敗し、msgcat.tcl の場所を見失う

  • WindowsのUNCパス(\\server\share\app.exe)実行時にTclのパス参照が不安定になる

結果として、Tcl側の「msgcat」モジュールをロードできず、
GUI初期化時にinvalid commandエラーが出るというわけです。

発生源は ttkbootstrapではなく Tcl/Tk

このエラーは ttkbootstrap そのものではなく、
Tkinterの下層にあるTcl/Tkランタイムがネットワーク経由で動かないことが原因です。

実際、tkinter単体で次のコードをexe化して同じドライブで実行しても、
同様の ::msgcat::mcmset エラーが再現します。

import tkinter as tk

root = tk.Tk()

root.mainloop()

 

つまり、ttkbootstrapはただTkinterを呼び出しているだけで、原因はより下層にあります。

Tcl/Tkの「invalid command name ::msgcat::mcmset」を解消する3つの実践対処法

ここからは、実際にエラーを解決するための具体的な手順を紹介します。
順番に試していくことで、ほとんどのケースは改善します。

✅ 対処法①:PyInstallerでTclライブラリを明示的に同梱する

PyInstaller は通常、Tcl/Tkの依存ファイルを自動検出しますが、
バージョンによっては一部の .tcl スクリプト(特に msgcat.tcl)が抜け落ちることがあります。
その場合は手動でパスを指定します。

手順

PythonのTclライブラリの場所を確認します。
例(Python 3.13 の場合):

C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python313\tcl\

  1.  この中に tcl8.6tk8.6 フォルダがあるはずです。

PyInstallerのコマンドに以下のオプションを追加します。

pyinstaller your_app.py --add-data "C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python313\tcl\tcl8.6;./tcl/tcl8.6" --add-data "C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python313\tcl\tk8.6;./tcl/tk8.6"

  1.  ※セミコロン「;」はWindows用の区切りです(macOS/Linuxでは「:」)。

  2. ビルド後、distフォルダ内に tcl フォルダが生成されていることを確認。

  3. ネットワークドライブにコピーして再実行。
    msgcat関連のエラーが出なければ成功です。

✅ 対処法②:実行時にTclパスを明示的に指定する

もしPyInstallerで修正してもエラーが出る場合は、
実行時にTclの検索パスをコードで明示的に指定する方法が有効です。

コード例

import os

import sys

import tkinter as tk

import ttkbootstrap as ttk

 

# exe内または同階層にtcl/tkフォルダを同梱した場合の対応

if getattr(sys, 'frozen', False):

    base_path = sys._MEIPASS

    os.environ['TCL_LIBRARY'] = os.path.join(base_path, 'tcl', 'tcl8.6')

    os.environ['TK_LIBRARY'] = os.path.join(base_path, 'tcl', 'tk8.6')

else:

    # 通常のPython実行時(開発用)

    os.environ['TCL_LIBRARY'] = r"C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python313\tcl\tcl8.6"

    os.environ['TK_LIBRARY'] = r"C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python313\tcl\tk8.6"

 

# ここからGUIを起動

root = ttk.Window(themename="darkly")

root.title("TclPath Test")

root.mainloop()

 

この設定により、exeがどの場所で起動しても
必ず指定フォルダ内のtclスクリプトを参照するようになります。

✅ 対処法③:ネットワークドライブではなくローカルに配置して実行

WindowsのTcl/Tkは、**UNCパス(\サーバー名\共有フォルダ)**や
「信頼されていないネットワークストレージ」上でスクリプトを実行する際、
セキュリティポリシーによりファイルアクセスが制限されることがあります。

そのため、

  • ネットワークドライブ上でexeを起動する
     → Tclのロードパスが“外部実行扱い”となり、読み込み拒否される

  • Cドライブ上で起動する
     → 正常に動作

という挙動になります。

対処策

  1. exeをネットワーク上に置いたまま使うのではなく、
     ユーザーのローカルPC(例:C:\MyApp\)にコピーして実行。

  2. もしどうしても共有フォルダ上で実行したい場合は、
     そのフォルダを Windows Defender の除外リスト に登録するか、
     TCL_LIBRARY を絶対パスでローカル参照に固定します。

🧩 補足:ttkbootstrapはTkinterのラッパーにすぎない

よく「ttkbootstrapが原因でエラーが出る」と思われますが、
実際はTkinter内部の問題であり、ttkbootstrap自体に欠陥はありません。

つまり、根本的な対策は Tcl/Tkのライブラリを確実に同梱・参照できるようにすること。
これさえできれば、どんな環境でも正常動作します。

✅ まとめ

原因

内容

解決策

Tcl/Tkライブラリ不足

msgcat.tcl が含まれていない

PyInstallerで手動同梱

実行時パス不明

Tclパスを見失う

os.environ でパス指定

ネットワーク制限

UNCパスで実行不可

ローカルへコピーして実行

最後に

_tkinter.TclError: invalid command name "::msgcat::mcmset"
「GUIランタイムが正しくロードできていない」という単純な構造のエラーです。

したがって、
① Tclフォルダを同梱し、② 実行時にパス指定、③ ローカルから実行
という3ステップを守れば確実に解消できます。

Python 3.13環境でもこの方法で安定動作が確認されていますので、
まずはPyInstallerの --add-data 設定から試してみてください。






以上の内容はhttps://error-daizenn.hatenablog.com/entry/2025/11/01/225426より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14