Киви не показывает (бенгальский) персонаж правильно?

Kivy Python не поддерживает соединение бенгальских символов. Есть ли другой способ решить эту проблему?

Кто-нибудь может описать, в чем проблема? Что я могу сделать, чтобы решить эту проблему?

Ожидаемый результат:

Программный вывод:

1 ответ

Соответствующее средство визуализации текста необходимо для правильной обработки шрифтов Bangla (и других шрифтов со сложными глифами). Средство визуализации текста pango имеет такие функции, как откат, сложная обработка глифов и многие другие функции. Kivy поддерживает средство визуализации текста панго с ограниченными функциями на данный момент. В настоящее время это протестировано в MacOS и Linux. Ниже приведена процедура, демонстрирующая установку средства визуализации текста панго с Kivy, а также пример приложения, показывающего правильную визуализацию текста бангла. Процедура предполагала, что Kivy уже установлен в Linux (Ubuntu 18.04).

  1. Проверьте с помощью следующей команды, правильно ли уже установлен pango:

    pkg-config --libs pangoft2

    если панго установлен правильно, он выдаст следующий результат:

    -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 (или любой другой файл шрифта bangla unicode) в подкаталоге с именем 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.

Вывод программы:

Итак, текст отображается правильно. Вы можете проверить с любыми другими составными буквами Bangla, оно будет отображаться правильно.

Для других платформ, таких как Windows, проблема состоит в том, чтобы правильно установить pango. Возможно, это будет нетривиально, поскольку я пока не нашел простого способа. Возможно, панго нужно скомпилировать из исходников с учетом его зависимостей.

В моем предыдущем ответе я описал процедуру установки и активации pangoтекст, отображаемый на сервере в Linux. Здесь я объясню процедуру установки и активации pangoдля Kivy в среде Windows. Ниже приведена среда, в которой тестируется процедура:

  • Windows 10
  • Python 3.6.8 (64-разрядная)
  • Киви 2.0.0rc3

Ниже приведены шаги, которые необходимо выполнить:

  1. Создайте каталог с именем src в корне C: диск и перейдите в этот каталог:

             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, загрузите исходный tar-файл версии Kivy 2.0.0rc3 с https://pypi.org/project/Kivy/2.0.0rc3/#files и распакуйте в любую подходящую папку.

  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-config интеграция инструмента с vcpkg.

  7. Добавить C:/src/vcpkg/installed/x64-windows/lib и C:/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++ build tools": "Windows 10 SDK (версия)", "Инструменты C++ CMake для Windows", "Поддержка 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 (или любой другой файл шрифта bangla unicode) в подкаталоге с именем 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, как с gvsbuildскрипты, упомянутые на официальном сайте GTK. Он имеет pkg-configинтеграция. Но он не интегрируется успешно с Kivy. Установка через vcpkg, как описано в этой процедуре, является единственной успешной процедурой, которую я нашел.

Другие вопросы по тегам