
はじめに
PythonでGUIアプリを作成して配布する際、よくある落とし穴の一つが「exe化後のTcl/Tk関連エラー」です。
特に ttkbootstrap(Tkinterをモダンデザイン化するライブラリ)を使っている場合、
ローカルでは動作しても、別の環境やネットワークドライブ上で起動すると突然クラッシュすることがあります。
今回のエラーはまさにその典型例。
_tkinter.TclError: invalid command name "::msgcat::mcmset"
Python 3.13環境でこのメッセージが出た場合、
Tcl/Tkの「msgcat」モジュールが見つからず、国際化メッセージ処理が初期化できない
という意味になります。
一見すると「ttkbootstrapのバグ?」と思ってしまいますが、
実際は exe化の過程で必要なTclファイルが正しくパッケージングされていない ことが原因です。
- はじめに
- エラーの発生状況の整理
- エラー文の意味を分解
- では、なぜ「Cドライブでは動くのに、ネットワークドライブでは落ちる」のか
- 発生源は ttkbootstrapではなく Tcl/Tk
- Tcl/Tkの「invalid command name ::msgcat::mcmset」を解消する3つの実践対処法
- 🧩 補足:ttkbootstrapはTkinterのラッパーにすぎない
- ✅ まとめ
エラーの発生状況の整理
あなたの状況を時系列で整理するとこうなります。
- Python 3.13 + ttkbootstrap を使用してGUIアプリを作成。
- pyinstaller(または他のexe化ツール)でビルドして dist フォルダ内のexeを実行。
- 同一PC・ローカルドライブ(Cドライブ)内では正常起動。
- exeをネットワーク共有ドライブにコピーし、そこから起動した途端に以下のエラーが発生:
_tkinter.TclError: invalid command name "::msgcat::mcmset"
- エラー箇所は 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_LIBRARY や TK_LIBRARY を参照して
tcl8.6 や tk8.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\
- この中に tcl8.6 と tk8.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"
- ※セミコロン「;」はWindows用の区切りです(macOS/Linuxでは「:」)。
- ビルド後、distフォルダ内に tcl フォルダが生成されていることを確認。
- ネットワークドライブにコピーして再実行。
→ 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ドライブ上で起動する
→ 正常に動作
という挙動になります。
対処策
- exeをネットワーク上に置いたまま使うのではなく、
ユーザーのローカルPC(例:C:\MyApp\)にコピーして実行。 - もしどうしても共有フォルダ上で実行したい場合は、
そのフォルダを 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 設定から試してみてください。