阿拉伯语文本的 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
我正在尝试使用 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