1

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

任何人都可以描述是什么问题吗?我能做些什么来解决它?

预期输出:

程序输出:

4

2 回答 2

2

需要适当的文本渲染器来正确处理孟加拉字体(以及其他具有复杂字形的字体)。文本渲染器 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可能不需要环境设置,因为之前已经导出。但这是为了展示如何选择文本渲染器。您需要在kalpurush.ttf名为font.

运行程序时的 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 需要从源代码编译它的依赖项。

于 2020-08-31T09:45:18.070 回答
1

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

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

以下是要遵循的步骤:

  1. 创建一个以驱动器src根目录命名的目录C:并转到该目录:

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

    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. 安装成功后,从https://pypi.org/project/Kivy/2.0.0rc3/#filespango下载 Kivy 2.0.0rc3 版本的源码包并解压到任何合适的文件夹中。

  6. 现在转到提取 Kivy 2.0.0rc3 源文件的文件夹并setup.py在文本编辑器(最好是 Notepad++)中打开文件。搜索包含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-configvcpkg.

  7. C:/src/vcpkg/installed/x64-windows/lib将和添加C:/src/vcpkg/installed/x64-windows/binPATH系统环境变量。

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

    python -m pip install --upgrade pip wheel setuptools
    
  9. 从“Visual C++ 构建工具”部分获取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()
    

    您需要在kalpurush.ttf名为font.

    运行程序时的 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,例如gvsbuildGTK 官方网站中提到的脚本。它也有pkg-config集成。但它没有与 Kivy 成功集成。如此过程中所述,通过 安装vcpkg是我发现的唯一成功的过程。

于 2020-09-06T14:55:21.643 回答