Kivy Python中波斯语/阿拉伯语多行文本显示倒置问题求助
解决Kivy中波斯语/阿拉伯语多行文本倒置问题
问题根源
当使用get_display处理包含自动换行的长RTL文本时,整个文本块会被当作单一RTL元素处理,导致多行的显示顺序被反转(从下到上)。短文本无此问题是因为未触发换行。
解决方案
通过逐行处理文本,确保每行的RTL转换正确,同时保留行的从上到下顺序。配合MDLabel的自动换行设置,即可实现正常显示。
修改后的完整代码
from kivy.lang import Builder import arabic_reshaper from bidi.algorithm import get_display from kivymd.app import MDApp def process_rtl_text(text): # 对文本逐行进行RTL转换,避免行顺序反转 reshaped_text = arabic_reshaper.reshape(text) lines = reshaped_text.split('\n') processed_lines = [get_display(line) for line in lines] return '\n'.join(processed_lines) KV = ''' #:import arabic_reshaper arabic_reshaper #:import get_display bidi.algorithm.get_display #:import process_rtl_text __main__.process_rtl_text Screen: BoxLayout: orientation: "vertical" ScrollView: do_scroll_x: False do_scroll_y: True index:1 MDCard: id: md_card orientation: "vertical" padding: "8dp" size_hint: None, None size: 300, 300 MDLabel: font_name: 'font/Sahel.ttf' text: get_display(arabic_reshaper.reshape('تست نام')) halign: "right" MDSeparator: height: "1dp" MDLabel: font_name: 'font/Sahel.ttf' halign: "right" text_size: self.width, None # 启用自动换行,绑定控件宽度 text: process_rtl_text('این یک متن فارسی صرفا برای تست است در کیوی نمایش آن اشتباه از پایین به سمت بالا است.') ''' class Test(MDApp): def build(self): return Builder.load_string(KV) Test().run()
关键修改说明
- 新增
process_rtl_text函数:将文本按行分割,逐行执行arabic_reshaper和get_display处理,再重新拼接,确保行顺序不被反转。 - 给长文本的MDLabel添加
text_size: self.width, None:强制控件根据自身宽度自动换行,配合逐行处理的文本,实现正常的从上到下多行显示。 - 确保字体文件路径正确:
Sahel.ttf需放在代码指定的font目录下。
内容的提问来源于stack exchange,提问作者goldaaa
相关产品推荐
相关产品推荐

