阿拉伯语文本的 Kivy 文本输入

Kivy Text Input for Arabic Text

我正在尝试使用 Kivy 的阿拉伯语文本输入法。我的文本输入设置了阿拉伯语字体,但是当我输入输入(阿拉伯语)时,我只得到从左到右出现的阿拉伯字母(它们没有连接,因为阿拉伯字母应该是相邻的)彼此)。

有没有办法获得 Kivy/text 输入以支持我缺少的 RTL 语言输入(尤其是阿拉伯语)。

这是我的代码,

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout

Config.set('graphics', 'width', '300')
Config.set('graphics', 'height', '500')


logger = logging.getLogger('')

from kivy.uix.textinput import TextInput


class EditorApp(App):
    def build(self):
        f = FloatLayout()
        textinput = TextInput(text='Hello world', font_name='DroidKufi-Regular.ttf')
        # import pdb; pdb.set_trace()

        f.add_widget(textinput)

        return f


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

这段代码的结果:

不幸的是,Kivy TextInput 对从右到左的支持是 an open issue(2015 年 5 月 29 日检查)。实际上,Kivy 不仅不支持 TextInput。

对于像标签这样的静态文本,可以使用 arabic_reshaper and python-bidi (reference):

进行破解
import arabic_reshaper
from bidi.algorithm import get_display

reshaped_text = arabic_reshaper.reshape(u'اللغة العربية رائعة')
bidi_text = get_display(reshaped_text)

然而,对于 TextInput 动态输入,您必须重写大多数 class 方法来支持 RTL,您最终会像实现对 kivy 的整个 RTL 支持。

这是实现 Kivy bidi support. Another closed one: Right-to-left labels support 的公开尝试。

所以有一个答案,我很幸运能够通过并尝试。

links 在这里:https://github.com/hosseinofj/persian_textinput_kivy/blob/master/codes

因为没有解释,也没有在这里发布代码,所以我会自己做,尽管也应该感谢发布这个link的用户!

无论如何,这是代码:

test.kv

<Ar_text@TextInput>:
    text: "whatever"
    multiline: 0
    size_hint: 1,1
    font_name: "data/unifont-11.0.02.ttf" # the font you want to use
    font_size: 26
    padding_y: [15,0] # can be changed
    padding_x: [self.size[0]-self._get_text_width(max(self._lines, key=len), self.tab_width, self._label_cached)-10,8]

main.py

'''
App demonstrating a Text input field which accepts Arabic script in kivy

'''


import arabic_reshaper
from bidi.algorithm import get_display
from kivy.app import App
from kivy.uix.textinput import TextInput
from kivy.properties import ObjectProperty, NumericProperty, StringProperty


class Ar_text(TextInput):
    max_chars = NumericProperty(20)  # maximum character allowed
    str = StringProperty()

    def __init__(self, **kwargs):
        super(Ar_text, self).__init__(**kwargs)
        self.text = get_display(arabic_reshaper.reshape("اطبع شيئاً"))


    def insert_text(self, substring, from_undo=False):
        if not from_undo and (len(self.text) + len(substring) > self.max_chars):
            return
        self.str = self.str+substring
        self.text = get_display(arabic_reshaper.reshape(self.str))
        substring = ""
        super(Ar_text, self).insert_text(substring, from_undo)

    def do_backspace(self, from_undo=False, mode='bkspc'):
        self.str = self.str[0:len(self.str)-1]
        self.text = get_display(arabic_reshaper.reshape(self.str))


class TestApp(App):

    def build(self):
        return Ar_text()


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

这个技巧是使用 arabic_shaper

因此,在每次更新文本时,您都使用 arabic_shaper.

为文本输入提供格式化字符串

仍然存在根本问题,即真正的 RTL 不存在(光标始终位于字符串末尾的右侧)

我添加了一个带有示例代码的回购协议。它 运行 在 Ubuntu 上。如果正确安装了 Kivy,它也应该 运行 在 windows

https://github.com/eliasaj92/arabic_text_input_kivy