【问题标题】:Kivy isn't showing (Bengali) joining character properly?Kivy 没有正确显示(孟加拉语)加入角色?
【发布时间】:2020-08-29 10:40:28
【问题描述】:

Kivy Python 不支持孟加拉语加入字符,有没有其他办法解决这个问题?

谁能描述一下是什么问题?我能做些什么来解决它?

预期输出:

程序输出:

【问题讨论】:

  • 这归结为字体渲染器的行为方式。 Kivy 支持多种字体渲染后端,但我不知道它们是如何(或可以)配置的细节,或者是否有任何特别支持这些功能。你可能会更幸运地在 Kivy discord 上获得帮助,因为那里有更多熟悉字体的人。

标签: python kivy bengali


【解决方案1】:

需要适当的文本渲染器才能正确处理孟加拉字体(以及其他具有复杂字形的字体)。文本渲染器 pango 具有后备、复杂字形处理等许多其他功能。截至目前,Kivy 支持功能有限的 pango 文本渲染器。目前,这已在 MacOS 和 Linux 中进行了测试。下面是演示如何使用 Kivy 安装 pango 文本渲染器的过程以及一个显示正确渲染孟加拉文本的示例应用程序。该过程假定 Kivy 已安装在 Linux (Ubuntu 18.04) 中。

  1. 如果 pango 已经安装,请使用以下命令检查 正确:

    pkg-config --libs pangoft2

    如果 pango 安装正确,那么它会产生如下 输出:

    -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype

    否则,如果它没有产生输出,那么它就没有被安装 正确。在这种情况下,请继续下一步。

  2. 发出以下命令并等待它完成执行:

    sudo apt-get update

  3. 接下来发出以下命令来安装 pango:

    sudo apt install libfreetype6-dev libpango1.0-dev libpangoft2-1.0-0

    如果安装正确,请再次检查步骤 1 中的命令。

  4. pango安装后,需要重新编译Kivy。对于第一个问题,以下命令:

    sudo apt-get install -y \
        python-pip \
        build-essential \
        git \
        python \
        python3-dev \
        ffmpeg \
        libsdl2-dev \
        libsdl2-image-dev \
        libsdl2-mixer-dev \
        libsdl2-ttf-dev \
        libportmidi-dev \
        libswscale-dev \
        libavformat-dev \
        libavcodec-dev \
        zlib1g-dev
    
  5. 然后依次发出以下三个命令:

    sudo pip3 install cython
    export USE_PANGOFT2=1
    export KIVY_TEXT=pango
    

    您可能会收到Requirement already satisfied 安装Cython 的消息,这没关系。

  6. 现在使用以下命令卸载 Kivy:

    sudo python3 -m pip uninstall kivy

  7. 并使用以下命令安装 Kivy:

    sudo pip3 install kivy

  8. 成功重新安装 Kivy 后,您可以运行以下示例:

import os
os.environ['KIVY_TEXT'] = 'pango'
from kivy.app import App
from kivy.lang import Builder


APP_KV = """
BoxLayout:
    Label:
        text: "সকালে"
        font_size: '48sp'
        font_name: 'font/kalpurush.ttf'
"""

class MainApp(App):
    def build(self):
        return Builder.load_string(APP_KV)

if __name__ == '__main__':
    MainApp().run()

KIVY_TEXT 环境设置可能不需要,因为之前已经导出。但这是为了展示如何选择文本渲染器。您需要在名为font 的子目录下拥有字体文件kalpurush.ttf(或任何其他bangla unicode 字体文件)。

运行程序时的Kivy日志如下:

[INFO   ] [Logger      ] Record log in /home/kivy/.kivy/logs/kivy_20-08-31_9.txt
[INFO   ] [Kivy        ] v1.11.1
[INFO   ] [Kivy        ] Installed at "/usr/local/lib/python3.6/dist-packages/kivy/__init__.py"
[INFO   ] [Python      ] v3.6.8 (default, Oct  7 2019, 12:59:55) 
[GCC 8.3.0]
[INFO   ] [Python      ] Interpreter at "/usr/bin/python3"
[INFO   ] [Factory     ] 184 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer ignored)
[INFO   ] [Window      ] Provider: sdl2(['window_egl_rpi'] ignored)
[INFO   ] [GL          ] Using the "OpenGL" graphics system
[INFO   ] [GL          ] Backend used <sdl2>
[INFO   ] [GL          ] OpenGL version <b'3.1 Mesa 19.0.8'>
[INFO   ] [GL          ] OpenGL vendor <b'VMware, Inc.'>
[INFO   ] [GL          ] OpenGL renderer <b'llvmpipe (LLVM 8.0, 256 bits)'>
[INFO   ] [GL          ] OpenGL parsed version: 3, 1
[INFO   ] [GL          ] Shading version <b'1.40'>
[INFO   ] [GL          ] Texture max size <8192>
[INFO   ] [GL          ] Texture max units <32>
[INFO   ] [Window      ] auto add sdl2 input provider
[INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
[INFO   ] [Text        ] Provider: pango
[INFO   ] [Base        ] Start application main loop
[INFO   ] [GL          ] NPOT texture support is available
[INFO   ] [WindowSDL   ] exiting mainloop and closing.
[INFO   ] [Base        ] Leaving application in progress...

请注意,文本提供者是pango

程序的输出:

因此,文本正确呈现。您可以使用任何其他复合孟加拉字母进行测试,它会正确呈现。

对于 Windows 等其他平台,挑战在于正确安装 pango。这样做可能并不简单,因为到目前为止我还没有找到简单的方法。可能是 pango 需要从源代码编译它的依赖项。

【讨论】:

    【解决方案2】:

    在我之前的回答中,我概述了在 Linux 中安装和激活 pango 文本呈现后端的过程。这里我将解释在Windows环境下为Kivy安装和激活pango的工作过程。以下是程序测试的环境:

    • Windows 10
    • Python 3.6.8(64 位)
    • 基维 2.0.0rc3

    以下是要遵循的步骤:

    1. C:驱动器的根目录下创建一个名为src的目录,然后 转到该目录:

      C:\>mkdir src 
      C:\>cd src 
      
    2. 运行以下命令将vcpkg克隆到src目录:

      git clone https://github.com/microsoft/vcpkg
      

      您需要安装Git 才能运行上述命令。

    3. 然后引导vcpkg并移动到vcpkg目录:

      C:\src>.\vcpkg\bootstrap-vcpkg.bat
      C:\src>cd vcpkg
      
    4. 现在运行以下命令来安装pango(及其依赖项):

      vcpkg install pango --triplet x64-windows
      
    5. pango 安装成功后,从https://pypi.org/project/Kivy/2.0.0rc3/#files 下载 Kivy 2.0.0rc3 版本的源码包并解压到任何合适的文件夹中。

    6. 现在转到解压 Kivy 2.0.0rc3 源文件的文件夹,并在文本编辑器(最好是 Notepad++)中打开 setup.py 文件。搜索包含if c_options['use_pangoft2'] in (None, True) 的行并在该行之前添加以下代码块并保存文件:

      if c_options['use_pangoft2'] in (None, True) and platform == 'win32':
          pango_flags = {}
          pango_flags['include_dirs'] = (['C:/src/vcpkg/installed/x64-windows/include', 'C:/src/vcpkg/installed/x64-windows/include/harfbuzz'])
          pango_flags['library_dirs'] = (['C:/src/vcpkg/installed/x64-windows/lib'])
          pango_flags['libraries'] = (['pangoft2-1.0', 'pango-1.0', 'gobject-2.0', 'glib-2.0', 'harfbuzz', 'freetype', 'fontconfig'])
          c_options['use_pangoft2'] = True
          pango_depends = {'depends': ['lib/pango/pangoft2.pxi', 'lib/pango/pangoft2.h']}
          sources['core/text/_text_pango.pyx'] = merge(base_flags, pango_flags, pango_depends)
          import subprocess
          subprocess.call(["setx", "FONTCONFIG_FILE", "C:\\src\\vcpkg\\installed\\x64-windows\\tools\\fontconfig\\fonts.conf"]) 
      

      目前需要手动配置为vcpkg 不会为编译器的自动填充生成 .pc 文件 通过pkg-conifg 链接变量。到目前为止还有 没有pkg-config 工具与vcpkg 的集成。

    7. C:/src/vcpkg/installed/x64-windows/libC:/src/vcpkg/installed/x64-windows/bin 添加到PATH 系统环境变量中。

    8. 现在 Kivy 需要从它的源代码编译。如果 Kivy 已经安装,请先卸载它。然后可以遵循官方 kivy 网站中提到的程序 - 尽管我在这里列出了需要遵循的步骤。升级点子和轮子:

      python -m pip install --upgrade pip wheel setuptools
      
    9. 获取Visual C++ Build Tools 并从“visual c++ 构建工具”部分安装以下组件:“Windows 10 SDK(版本)”、“适用于 Windows 的 C++ CMake 工具”、“C++/CLI 支持”、“MSVC v142 - VS 2019 C++ x64/x86 构建工具”。

    10. 设置所需的环境变量:

      set USE_SDL2=1
      set USE_PANGOFT2=1
      set USE_GSTREAMER=1
      
    11. 安装最新版本的kivy依赖:

      python -m pip install Cython==0.29.10 docutils pygments pypiwin32 kivy_deps.sdl2 kivy_deps.glew kivy_deps.gstreamer kivy_deps.glew_dev kivy_deps.sdl2_dev kivy_deps.gstreamer_dev
      
    12. 现在转到解压 Kivy 2.0.0rc3 源文件的根文件夹(```setup.py`` 文件所在的位置)并发出以下命令来编译和安装 Kivy:

      python -m pip install .
      
    13. Kivy安装成功后,可以运行下面的例子:

      import os
      os.environ['KIVY_TEXT'] = 'pango'
      from kivy.app import App
      from kivy.lang import Builder
      
      
      APP_KV = """
      BoxLayout:
          Label:
              text: "অল্প বিস্তর"
              font_size: '48sp'
              font_name: 'font/kalpurush.ttf'
      """
      
      class MainApp(App):
          def build(self):
              return Builder.load_string(APP_KV)
      
      if __name__ == '__main__':
          MainApp().run()
      

      您需要在名为font 的子目录下拥有字体文件kalpurush.ttf(或任何其他bangla unicode 字体文件)。

      运行程序时的Kivy日志如下:

      [INFO   ] [Logger      ] Record log in C:\Users\user\.kivy\logs\kivy_20-09-06_12.txt
      [INFO   ] [deps        ] Successfully imported "kivy_deps.gstreamer_dev" 0.2.0
      [INFO   ] [deps        ] Successfully imported "kivy_deps.gstreamer" 0.2.0
      [INFO   ] [deps        ] Successfully imported "kivy_deps.glew" 0.2.0
      [INFO   ] [deps        ] Successfully imported "kivy_deps.glew_dev" 0.2.0
      [INFO   ] [deps        ] Successfully imported "kivy_deps.sdl2" 0.2.0
      [INFO   ] [deps        ] Successfully imported "kivy_deps.sdl2_dev" 0.2.0
      [INFO   ] [Kivy        ] v2.0.0rc3, git-Unknown, 20200906
      [INFO   ] [Kivy        ] Installed at "C:\Python\Python36\lib\site-packages\kivy\__init__.py"
      [INFO   ] [Python      ] v3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)]
      [INFO   ] [Python      ] Interpreter at "C:\Python\Python36\python.exe"
      [INFO   ] [Factory     ] 185 symbols loaded
      [INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2 (img_pil, img_ffpyplayer, img_gif ignored)
      [INFO   ] [Window      ] Provider: sdl2
      [INFO   ] [GL          ] Using the "OpenGL" graphics system
      [INFO   ] [GL          ] GLEW initialization succeeded
      [INFO   ] [GL          ] Backend used <glew>
      [INFO   ] [GL          ] OpenGL version <b'4.6.0 - Build 26.20.100.7812'>
      [INFO   ] [GL          ] OpenGL vendor <b'Intel'>
      [INFO   ] [GL          ] OpenGL renderer <b'Intel(R) HD Graphics 520'>
      [INFO   ] [GL          ] OpenGL parsed version: 4, 6
      [INFO   ] [GL          ] Shading version <b'4.60 - Build 26.20.100.7812'>
      [INFO   ] [GL          ] Texture max size <16384>
      [INFO   ] [GL          ] Texture max units <32>
      [INFO   ] [Window      ] auto add sdl2 input provider
      [INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
      [INFO   ] [Text        ] Provider: pango
      [INFO   ] [Base        ] Start application main loop
      [INFO   ] [GL          ] NPOT texture support is available
      

      请注意,文本提供者是pango

      程序的输出:

      文本正确呈现。使用pango 其他具有字体回退要求的非英语语言字体,复杂的字形处理将正确呈现。

      还有其他安装pango 的过程,如GTK 官方网站中提到的gvsbuild 脚本。它还具有pkg-config 集成。但它没有与 Kivy 成功集成。通过vcpkg 进行安装,如此过程中所述,是我发现的唯一成功的过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 2013-11-13
      相关资源
      最近更新 更多