ttkbootstrap Tableview 右键编辑中文支持解决方案
ttkbootstrap Tableview 中文支持解决方案
问题描述
在使用ttkbootstrap库的Tableview组件时,右键菜单和UI元素显示为英文,没有自动使用中文显示,影响用户体验。
原因分析
通过分析ttkbootstrap的源代码,我们发现:
- ttkbootstrap确实支持多语言本地化,使用
MessageCatalog
类来管理翻译 - 虽然库中包含了中文(
zh_cn
和zh_tw
)的本地化文件,但某些版本中默认不会自动加载或应用这些翻译 - Tableview组件中的所有菜单文本和UI元素都通过
MessageCatalog.translate()
方法获取翻译
解决方案
创建了一个专用的工具类TableviewChineseSupport
来解决这个问题。该工具类会:
- 设置ttkbootstrap的语言为中文
- 检查是否已有可用的中文翻译
- 如果没有自动翻译,则手动添加所有必要的中文翻译文本
使用方法
1. 直接使用提供的示例文件
可以直接运行tableview_chinese_solution.py
文件查看效果:
python tableview_chinese_solution.py
2. 在现有项目中集成
将以下代码添加到您的现有项目中:
from ttkbootstrap.localization import MessageCatalogclass TableviewChineseSupport:"""为ttkbootstrap Tableview提供中文支持的工具类"""@staticmethoddef setup_chinese_localization(locale_code="zh_cn"):"""设置ttkbootstrap的中文本地化支持"""try:# 设置语言MessageCatalog.locale(locale_code)# 定义中文翻译映射zh_translations = {# 表格右键菜单翻译"Sort Ascending": "升序排序","Sort Descending": "降序排序","Filter": "筛选","Export": "导出","Move up": "上移","Move down": "下移","Delete selected rows": "删除选中行","Filter by cell's value": "按单元格值筛选","Hide select rows": "隐藏选中行","Show only select rows": "仅显示选中行","Export all records": "导出所有记录","Export current page": "导出当前页","Export current selection": "导出当前选择","Export records in filter": "导出筛选记录","Move to top": "移至顶部","Move to bottom": "移至底部",# 表头右键菜单翻译"Align left": "左对齐","Align center": "居中对齐","Align right": "右对齐","Clear filters": "清除筛选","Reset table": "重置表格","Columns": "列","Move": "移动","Align": "对齐","Hide column": "隐藏列","Delete column": "删除列","Show All": "显示全部","Move to left": "移至左侧","Move to right": "移至右侧","Move to first": "移至首位","Move to last": "移至末位",# 分页和搜索控件翻译"Search": "搜索","Page": "页","of": "共"}# 检查是否有默认翻译current_locale = MessageCatalog.locale()has_default_translations = False# 检查几个关键翻译for en_text in ["Sort Ascending", "Filter"]:if MessageCatalog.translate(en_text) != en_text:has_default_translations = Truebreak# 如果没有默认翻译,则手动添加if not has_default_translations:for en_text, zh_text in zh_translations.items():MessageCatalog.set(current_locale, en_text, zh_text)return Trueexcept Exception as e:print(f"设置中文本地化失败: {e}")return False# 在创建Tableview之前调用
TableviewChineseSupport.setup_chinese_localization()
工作原理
- 语言设置:通过
MessageCatalog.locale()
方法设置ttkbootstrap的显示语言 - 翻译检测:检查几个关键术语是否已有中文翻译
- 手动添加翻译:如果没有自动翻译,则通过
MessageCatalog.set()
方法为每个英文术语添加对应的中文翻译 - 自动应用:所有Tableview的UI元素会自动使用已设置的翻译
测试结果
测试显示,使用此解决方案后:
- Tableview的右键菜单(包括单元格右键菜单和表头右键菜单)显示为中文
- 分页控件和搜索框的文本显示为中文
- 所有操作提示和按钮文本显示为中文
兼容性说明
此解决方案兼容ttkbootstrap的各个版本。不同版本可能内置的翻译有所不同,但此解决方案会自动检测并补充缺失的翻译。
附:ttkbootstrap全中文汉化包:
LocaleMsgs("zh_cn_new",("&Abort", "中止(&A)"),("&About...", "关于(&A)……"),("&Apply", "应用(&A)"),("&Blue", "蓝色(&B)"),("&Cancel", "取消(&C)"),("&Clear Console", "清除终端(&C)"),("&Copy", "复制(&C)"),("&Delete", "删除(&D)"),("&Directory:", "目录(&D):"),("&Edit", "编辑(&E)"),("&File", "文件(&F)"),("&Filter", "过滤(&F)"),("&Font:", "字体(&F):"),("&Green", "绿色(&G)"),("&Help", "帮助(&H)"),("&Hide Console", "隐藏终端(&H)"),("&Ignore", "忽略(&I)"),("&No", "否(&N)"),("&OK", "确定(&O)"),("&Open", "打开(&O)"),("&Quit", "退出(&Q)"),("&Red", "红色(&R)"),("&Retry", "重试(&R)"),("&Save", "保存(&S)"),("&Selection:", "选择(&S):"),("&Size:", "大小(&S):"),("&Source...", "来源(&S)……"),("&Underline", "下划线(&U)"),("&Yes", "确定(&Y)"),("⎌", "↺"),("A4", "A4"),("abort", "中止"),("Add", "新增"),("Advanced", "高级"),("Align", "对齐"),("Align center", "居中"),("Align left", "左对齐"),("Align right", "右对齐"),("All Files", "所有文件"),("Application Error", "应用程序错误"),("Blue", "蓝色"),("Bold", "粗体"),("Bold Italic", "加粗斜体"),("Cancel", "取消"),("cancel", "取消"),(r"Cannot change to the directory %1\$s.\nPermission denied.",r"无法更改目录 %1\$s。\n访问被拒绝。"),("Choose Directory", "选择文件夹"),("Cl&ear", "清除(&E)"),("Clear filters", "Limpar filtros"),("Close", "关闭"),("Color", "颜色"),("Color Chooser", "颜色选择器"),("color dropper", "颜色选择器"),("Columns", "列"),("Console", "终端"),("Continue", "继续"),("Copies", "复制"),("Cu&t", "剪&切"),("Current", "当前"),("Delete", "删除"),("Delete column", "删除列"),("Delete selected rows", "删除所选行"),("Details >>", "详细信息 >>"),(r"Directory %1\$s does not exist.", r"目录 %1\$s 不存在。"),("E&xit", "退出(&X)"),("Effects", "效果"),(r"Error: %1\$s", r"错误: %1\$s"),("Export", "导出"),("Export all records", "导出所有内容"),("Export current page", "导出当前页面"),("Export current selection", "导出当前所选"),("Export records in filter", "导出筛选内容"),("extension", "扩展"),("extensions", "扩展"),("Family", "组"),("Fi&les:", "文件(&L):"),("Fil&ter:", "过滤(&T):"),(r"File %1\$s already exists.\n\n", r"文件 %1\$s 已经存在。\n\n"),(r"File %1\$s already exists.\nDo you want to overwrite it?",r"文件 %1\$s 已经存在。\n您想要覆盖它吗?"),(r"File %1\$s does not exist.", r"文件 %1\$s 不存在。"),("File &name:", "文件名(&N):"),("File &names:", "文件名(&N):"),("Files of &type:", "文件类型(&T):"),("Filter", "筛选"),("Filter by cell's value", "使用单元格值筛选"),("Font", "字体"),("Font Selector", "字体选择器"),("Font st&yle:", "字体样式(&Y):"),("Fr", "五"),("Grayscale", "灰度"),("Green", "绿色"),("Hex", "Hex"),("Hi", "你好"),("Hide column", "隐藏列"),("Hide select rows", "隐藏所选行"),("Hue", "色相"),("ignore", "忽略"),("Invalid data type", "无效数据类型"),(r"Invalid file name %1\$s.", r"无效的文件名 %1\$s。"),("italic", "斜体"),("Italic", "斜体"),("Landscape", "横向"),("Legal ", "合法的 "),("Letter ", "Letter"),("Log Files", "日志文件"),("Mo", "一"),("Move", "移动"),("Move down", "下移"),("Move to bottom", "移至底部"),("Move to first", "移至第一"),("Move to last", "移至最后"),("Move to left", "移至左侧"),("Move to right", "移至右侧"),("Move to top", "移至顶部"),("Move up", "上移"),("New", "新增"),("Next", "下一步"),("No", "否"),("normal", "正常"),("Number cannot be greater than", "数字不能大于"),("of", "of"),("OK", "确定"),("Ok", "确定"),("ok", "确定"),("Open", "打开"),("Open Multiple Files", "打开多个文件"),("Options", "设置"),("Orientation", "方向"),("Out of range", "超出范围"),("Output", "输出"),("overstrike", "overstrike"),("P&aste", "粘贴(&A)"),("Page", "页数"),("Paper", "纸"),("Portrait", "竖向"),("Prev", "上一步"),("Preview", "预览"),("Previous", "以前的"),("Print", "输出"),("Printer", "打印机"),("Red", "红色"),("red", "红色"),("Regular", "规则"),("Remove", "移除"),("Replace existing file?", "替换已有文件?"),("Reset table", "重置表格"),("retry", "重试"),("Retry", "重试"),("RGB", "RGB"),("roman", ""),("Sa", "六"),("Sample", "范本"),("Save As", "另存为"),("Save To Log", "保存到日志"),("Scale", "规模"),("Search", "搜索"),("Select a file to source", "选择一个来源文件"),("Select Log File", "选择日志文件"),("Should be of data type", "应为数据类型"),("Show &Hidden Directories", "显示隐藏目录(&H)"),("Show &Hidden Files and Directories", "显示隐藏文件和目录(&H)"),("Show All", "显示全部"),("Show only select rows", "只显示所选行"),("Size", "大小"),("Skip Messages", "跳过消息"),("Slant", "倾斜"),("Sort", "排序"),("Sort Ascending", "顺序"),("Sort Descending", "倒序"),("Standard", "标准"),("Stri&keout", "删除线(&K)"),("Su", "日"),("Submit", "上传"),("Tcl for Windows", "适用于Windows的Tcl"),("Tcl Scripts", "Tcl脚本"),("Text Files", "文本文件"),("Th", "四"),("The quick brown fox jumps over the lazy dog.", "敏捷的棕色狐狸跳过懒惰的狗。"),("Themed", "主题化"),("Tu", "二"),("underline", "下划线"),("We", "三"),("Weight", "重量"),("yes", "确认"),("Yes", "确认"),)
测试用例:
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
from ttkbootstrap.tableview import Tableview
from ttkbootstrap.localization import MessageCatalogclass TableviewChineseSupport:"""为ttkbootstrap Tableview提供中文支持的工具类"""@staticmethoddef setup_chinese_localization(locale_code="zh_cn"):"""设置ttkbootstrap的中文本地化支持Args:locale_code: 语言代码,可以是'zh_cn'(简体中文)或'zh_tw'(繁体中文)"""try:# 设置语言MessageCatalog.locale(locale_code)print(f"已设置ttkbootstrap语言为: {locale_code}")# 定义简体中文翻译映射zh_translations = {# 表格右键菜单翻译"Sort": "排序","Sort Ascending": "升序排序","Sort Descending": "降序排序","Filter": "筛选","Export": "导出","Move up": "上移","Move down": "下移","Delete selected rows": "删除选中行","Filter by cell's value": "按单元格值筛选","Hide select rows": "隐藏选中行","Show only select rows": "仅显示选中行","Export all records": "导出所有记录","Export current page": "导出当前页","Export current selection": "导出当前选择","Export records in filter": "导出筛选记录","Move to top": "移至顶部","Move to bottom": "移至底部",# 表头右键菜单翻译"Align left": "左对齐","Align center": "居中对齐","Align right": "右对齐","Clear filters": "清除筛选","Reset table": "重置表格","Columns": "列","Move": "移动","Align": "对齐","Hide column": "隐藏列","Delete column": "删除列","Show All": "显示全部","Move to left": "移至左侧","Move to right": "移至右侧","Move to first": "移至首位","Move to last": "移至末位",# 分页和搜索控件翻译"Search": "搜索","Page": "页","of": "共"}# 检查是否有默认翻译,如果没有则手动添加current_locale = MessageCatalog.locale()has_default_translations = False# 检查几个关键翻译for en_text in ["Sort Ascending", "Filter"]:if MessageCatalog.translate(en_text) != en_text:has_default_translations = Truebreak# 如果没有默认翻译或者强制覆盖,则手动添加if not has_default_translations:print("正在添加中文翻译...")for en_text, zh_text in zh_translations.items():MessageCatalog.set(current_locale, en_text, zh_text)print("中文翻译添加完成!")else:print("检测到已存在默认中文翻译,使用现有翻译。")return Trueexcept Exception as e:print(f"设置中文本地化失败: {e}")return False# 示例:如何使用这个工具类
if __name__ == "__main__":# 创建应用程序窗口root = ttk.Window(themename="cosmo")root.title("Tableview中文示例")root.geometry("800x600")# 设置中文支持TableviewChineseSupport.setup_chinese_localization()# 创建一个框架来放置表格frame = ttk.Frame(root, padding=10)frame.pack(fill=BOTH, expand=YES)# 设置表格列定义coldata = [{'text': 'ID', 'width': 50},{'text': '名称', 'width': 200},{'text': '数值', 'width': 100},{'text': '状态', 'width': 100}]# 设置表格数据rowdata = [[1, '测试项目一', 100, '正常'],[2, '测试项目二', 200, '警告'],[3, '测试项目三', 300, '错误'],[4, '测试项目四', 400, '正常'],[5, '测试项目五', 500, '正常'],[6, '测试项目六', 600, '警告'],[7, '测试项目七', 700, '正常'],[8, '测试项目八', 800, '正常'],[9, '测试项目九', 900, '错误'],[10, '测试项目十', 1000, '正常']]# 创建表格视图table = Tableview(master=frame,coldata=coldata,rowdata=rowdata,paginated=True,searchable=True,bootstyle="primary")table.pack(fill=BOTH, expand=YES, padx=5, pady=5)# 添加说明文本instructions = ttk.Label(root,text="右键点击表格或表头查看中文菜单",justify=CENTER,padding=10)instructions.pack(fill=X)# 运行应用程序root.mainloop()