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

时间:2015-05-28 18:50:59

标签: python kivy arabic right-to-left

我试图将Kivy的文字输入用于阿拉伯文字。我有一个阿拉伯字体设置与我的文本输入,但当我输入输入(阿拉伯语)我只是从左到右出现阿拉伯字母(他们没有连接,因为阿拉伯字母应该是他们&#39 ;彼此相邻)。

有没有办法让Kivy /文本输入支持我缺少的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()

此代码的结果:

enter image description here

2 个答案:

答案 0 :(得分:6)

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

对于像标签这样的静态文字,使用arabic_reshaperpython-bidireference)会产生黑客攻击:

import arabic_reshaper
from bidi.algorithm import get_display

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

enter image description here

然而,对于具有动态输入的TextInput,您必须覆盖大多数类方法以支持RTL,您最终将实现对kivy的整个RTL支持。

以下是实施Kivy bidi support的公开尝试。另一个封闭的:Right-to-left labels support

答案 1 :(得分:2)

很幸运,我有一个答案可以尝试一下。

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

由于它被删除了,因为它没有解释,也没有在此处发布代码,所以我自己来做,尽管也应该以某种方式感谢发布此链接的用户!

无论如何,这是代码:

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