在Pydroid中使用ttkbootstrap报错:_tkinter.TclError: invalid command name ::msgcat::mcmset
解决Pydroid中ttkbootstrap启动报错
::msgcat::mcmset的问题 问题现象
在Pydroid中运行极简ttkbootstrap脚本时触发以下错误:
Traceback (most recent call last): File "/data/user/0/ru.iiec.pydroid3/files/temp_iiec_codefile.py", line 5, in <module> base = ttk.Window() ^^^^^^^^^^^^ File "/data/user/0/ru.iiec.pydroid3/files/arm-linux-androideabi/lib/python3.11/site-packages/ttkbootstrap/window.py", line 279, in __init__ self._style = Style(themename) ^^^^^^^^^^^^^^^^ File "/data/user/0/ru.iiec.pydroid3/files/arm-linux-androideabi/lib/python3.11/site-packages/ttkbootstrap/style.py", line 489, in __init__ localization.initialize_localities() File "/data/user/0/ru.iiec.pydroid3/files/arm-linux-androideabi/lib/python3.11/site-packages/ttkbootstrap/localization/msgs.py", line 9, in initialize_localities m.initialize() File "/data/user/0/ru.iiec.pydroid3/files/arm-linux-androideabi/lib/python3.11/site-packages/ttkbootstrap/localization/msgs.py", line 27, in initialize MessageCatalog.set_many(self.locale, *messages) File "/data/user/0/ru.iiec.pydroid3/files/arm-linux-androideabi/lib/python3.11/site-packages/ttkbootstrap/localization/msgcat.py", line 142, in set_many return int(root.tk.eval(out)) ^^^^^^^^^^^^^^^^^ _tkinter.TclError: invalid command name "::msgcat::mcmset"
测试脚本:
import tkinter as tk import ttkbootstrap as ttk base = ttk.Window() base.mainloop()
问题原因
Pydroid内置的Tcl环境为精简体积移除了msgcat扩展包,而ttkbootstrap的本地化模块依赖该包实现多语言支持,导致初始化时触发命令不存在的错误。
解决方案
方案1:手动加载msgcat包
在导入ttkbootstrap之前,通过tkinter的Tcl解释器手动加载msgcat包:
import tkinter as tk # 手动加载msgcat Tcl包 root = tk.Tk() root.tk.eval('package require msgcat') root.destroy() # 销毁临时窗口 import ttkbootstrap as ttk base = ttk.Window() base.mainloop()
方案2:降级ttkbootstrap版本
较新的ttkbootstrap版本引入了本地化依赖,尝试降级到不依赖msgcat的旧版本(比如v1.10.1):
在Pydroid的包管理器中搜索ttkbootstrap,选择版本1.10.1安装,或通过终端执行:
pip install ttkbootstrap==1.10.1
方案3:替换为标准ttk组件
如果上述方案都无法生效,可暂时使用tkinter内置的ttk组件替代:
import tkinter as tk from tkinter import ttk base = tk.Tk() base.title("替代方案") btn = ttk.Button(base, text="测试按钮") btn.pack(padx=20, pady=20) base.mainloop()
内容的提问来源于stack exchange,提问作者Reks MW
相关产品推荐
相关产品推荐

