Kivy应用中文显示异常:MDTopAppBar及加载弹窗字符呈星号
KivyMD中文显示异常排查与解决
问题场景
MDLabel中文显示正常:已安装文泉驿微米黑字体,在MDLabel中指定该字体后中文显示正常:
MDLabel: size_hint_x: 0.5 text: "结果(条):" font_name: 'WenQuanYi Micro Hei'MDTopAppBar右侧操作项提示异常:同样设置
font_name后,右侧操作项的中文提示显示为星号:MDTopAppBar: title: "Preview" font_name: 'WenQuanYi Micro Hei' right_action_items: [["home", lambda x: root.SwitchScreen('HomeScreen'),"返回首页"],["power", lambda x: app.on_custom_stop(),"退出"]] md_bg_color: app.theme_cls.primary_dark加载弹窗中文显示异常:已在应用顶部注册字体并设置UTF-8编码:
# -*- coding: utf-8 -*- from kivy.core.text import LabelBase LabelBase.register(name='WenQuanYi Micro Hei', fn_regular='/usr/share/fonts/truetype/wqy/wqy-microhei.ttc')但执行
start_process_preprocessedImage方法时,加载弹窗的中文仍显示为星号(如****Loading model...)
原因与解决办法
1. MDTopAppBar操作项提示的问题
MDTopAppBar的右侧操作项提示是由内部的MDTooltip组件渲染的,不会继承TopAppBar的font_name设置,得单独给ToolTip指定字体:
方法一:全局设置ToolTip字体
在应用初始化代码里添加:
from kivymd.uix.tooltip import MDTooltip # 全局给所有ToolTip指定字体 MDTooltip.font_name = 'WenQuanYi Micro Hei'
方法二:KV语言自定义样式
在KV文件开头添加:
<MDTooltip>: font_name: 'WenQuanYi Micro Hei'
2. 加载弹窗的问题
加载弹窗(比如MDProgressDialog或自定义弹窗)的文本组件没有使用指定字体,得手动给弹窗内的文本组件设置font_name:
如果是MDProgressDialog:
创建弹窗时遍历内部组件,给Label设置字体:
from kivymd.uix.dialog import MDProgressDialog def show_loading_dialog(): dialog = MDProgressDialog(text="加载模型中...") # 找到弹窗内的文本组件并设置字体 for widget in dialog.content_cls.children: if hasattr(widget, 'font_name'): widget.font_name = 'WenQuanYi Micro Hei' dialog.open()
如果是自定义弹窗:
确保弹窗内所有文本组件(如MDLabel)都显式指定font_name: 'WenQuanYi Micro Hei'
额外检查项
- 确认字体注册成功:打印已注册字体列表,看文泉驿微米黑是否在其中:
print(LabelBase.list_fonts()) - 全局统一字体(可选):通过修改主题样式,让所有组件默认使用该字体,避免逐个设置:
from kivymd.app import MDApp class YourApp(MDApp): def build(self): # 给常用文本样式指定字体 self.theme_cls.font_styles["Body1"] = "WenQuanYi Micro Hei" self.theme_cls.font_styles["Button"] = "WenQuanYi Micro Hei" self.theme_cls.font_styles["Caption"] = "WenQuanYi Micro Hei"
内容的提问来源于stack exchange,提问作者Calla
相关产品推荐
相关产品推荐

