我试图将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()
此代码的结果:
答案 0 :(得分:6)
不幸的是,Kivy TextInput对从右到左的支持是an open issue(2015年5月29日检查)。实际上,Kivy不仅支持从右到左的TextInput。
对于像标签这样的静态文字,使用arabic_reshaper和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
,您必须覆盖大多数类方法以支持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上运行