Kivy: 阿拉伯语文本输入

创建于 2013-10-19  ·  38评论  ·  资料来源: kivy/kivy

如何在打字时转换文本? http://postimg.org/image/u40ftpwm9/ http://postimg.org/image/ibefw8b89/你可以看到,当我输入 kivy 时,单词变形了,所以我使用了“arabic reshaper”来解决这个问题. 现在我可以使用转换按钮来修复它但是我应该如何在不按下转换按钮的情况下在打字时解决这个问题?

想要支持这个问题? 在上面发布赏金! 我们通过Bountysource接受赏金。

Has PR Feature

最有用的评论

我正在为 harfbuzz 库创建一个 python 绑定,以在 kivy 中使用它的文本字形信息,这样我们就可以使用它提供给我们的细节来推进光标。 通过混合使用 python-bidi 和pyharfbuzz ,我们可以为 kivy 提供多语言支持。

所有38条评论

尝试通过覆盖 insert_text 并通过阿拉伯语重新整形器传递文本来预处理输入。

这仍然是一个 hack,我们需要对从右到左的语言提供适当的支持,总是欢迎贡献/拉取请求,如果一些熟悉 RtoL 语言的人可以花时间在这方面会有所帮助。

tnx 为您解答。 我在 api 参考中找到了这个“insert_text(substring, from_undo=False)”你能给我一个使用它的简单例子吗? 我是 kivy 的新手。

这可以在文本输入中使用 halign 进行 rtl 吗?

TextInput 尚不支持对齐,这就是我所说的我们实际上需要对 RtoL 语言的适当支持。

好的 。 insert_text 例子呢?

tnx 我在我的 main.py 中写了这个,那么我怎样才能告诉 kivy 使用它进行文本输入呢?

我的 main.py 是:

import kivy
import arabic_reshaper
from bidi.algorithm import get_display

kivy.require('1.5.1')

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

from components.initialize import initialize_platform
from components.ttsspeak import ttsSpeak
from kivy.uix.textinput import TextInput

class NumericInput(TextInput):

    def insert_text(self, substring, from_undo=False):
        if not from_undo:
            try:
                int(substring)
            except ValueError:
                return
        super(NumericInput, self).insert_text(substring, from_undo)

class SayThis(FloatLayout):
    saywhat_text = ObjectProperty(None)

    def say_something(self, text):
        ttsSpeak(text)

    def clear(self, text):
        print text
        reshaped_text = arabic_reshaper.reshape(text)
        text = bidi_text = get_display(reshaped_text)
        print text
        self.saywhat_text.text =  text
        self.saywhat_text.focus = True


class SayThisApp(App):
    def build(self):
        initialize_platform()
        return SayThis()


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

我将 kivy.uix.textinput.py 更改为:

def _create_line_label(self, text, hint=False):
        reshaped_text = arabic_reshaper.reshape(text)
        text = get_display(reshaped_text)

现在它在显示阿拉伯语和波斯语方面没有问题,但我在 kivy 核心中改变了它,这不是一个好方法。 如何强制文本输入在我的应用程序中使用我的输入文本类? 正如我所说,我是 kivy 的新手

好吧,也许对这种变化进行公关会很好? 这增加了一个
kivy 对阿拉伯语 reshaper 的依赖,但我们需要国际化
无论如何,所以除非有更好的方法可以做到,否则我认为就是这样
向前。

至少应该讨论一下。

如果你只想为你的应用程序做这件事,你可以做一个类

类双向文本输入(文本输入):
def _create_line_label(self, text, hint=False):
reshape_text = arabic_reshaper.reshape(文本)
text = get_display(reshape_text)
超级(双向文本输入,自我)._create_line_label(文本,提示)

并在其余代码中使用此类而不是 TextInput。 (千伏
和 python,每次需要时调用 BidiTextInput 而不是 TextInput
它)。 (BidiTextInput 可能不是一个好名字,我想像一下吧
现在:P)

但我认为这将是对 kivy 的一个很好的补充。

在 2013 年 10 月 20 日星期日上午 03:16:32 -0700,尼玛写道:

我将 kivy.uix.textinput.py 更改为:+1:
def _create_line_label(self, text, hint=False):
reshape_text = arabic_reshaper.reshape(文本)
text = get_display(reshape_text)
现在它对阿拉伯语和波斯语没有问题,但我在 kivy 核心中改变了它,这不是一个好方法。 如何强制文本输入在我的应用程序中使用我的输入文本类? 正如我所说,我是 kivy 的新手


直接回复此邮件或在 GitHub 上查看:
https://github.com/kivy/kivy/issues/1570#issuecomment -26670261

tnx。 从右到左还有另一个问题,我必须解决它

我知道它现在正在工作,PR? :P

在 2013 年 10 月 21 日星期一上午 12:25:13 -0700,尼玛写道:

tnx。 从右到左还有另一个问题,我正在处理它


直接回复此邮件或在 GitHub 上查看:
https://github.com/kivy/kivy/issues/1570#issuecomment -26697061

我仍在从右到左工作,我的解决方案是获取光标位置和屏幕分辨率,并使用制表符将单词移动到正确的位置。 你有更好的主意吗?

嘿! 我在哪里可以找到阿拉伯语整形器?

嘿! 我在哪里可以找到阿拉伯语整形器?

https://github.com/mpcabd/python-arabic-reshaper

你想要haxe版本吗?
2014 年 8 月 5 日晚上 7:32,“Kashif Iftikhar” [email protected]写道:

嘿! 我在哪里可以找到阿拉伯语整形器?

https://github.com/mpcabd/python-arabic-reshaper


直接回复此邮件或在 GitHub 上查看
https://github.com/kivy/kivy/issues/1570#issuecomment -51223419。

对于文本输入它不会工作

def _create_line_label(self, text, hint=False):
reshape_text = arabic_reshaper.reshape(文本)
text = get_display(reshape_text)
将其添加到 TextInput 将获得:
回溯(最近一次通话最后):
文件“/home/sajad/PycharmProjects/kimiastone/Persian.py”,第 112 行,在
myApp().run()
运行中的文件“/usr/local/lib/python2.7/dist-packages/kivy/app.py”,第 824 行
运行触摸应用程序()
runTouchApp 中的文件“/usr/local/lib/python2.7/dist-packages/kivy/base.py”,第 487 行
EventLoop.window.mainloop()
文件“/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_pygame.py”,第 401 行,在 mainloop
self._mainloop()
_mainloop 中的文件“/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_pygame.py”,第 288 行
EventLoop.idle()
文件“/usr/local/lib/python2.7/dist-packages/kivy/base.py”,第 327 行,处于空闲状态
时钟.tick()
文件“/usr/local/lib/python2.7/dist-packages/kivy/clock.py”,第 483 行,勾选
self._process_events()
_process_events 中的文件“/usr/local/lib/python2.7/dist-packages/kivy/clock.py”,第 615 行
event.tick(self._last_tick, 移除)
文件“/usr/local/lib/python2.7/dist-packages/kivy/clock.py”,第 374 行,勾选
ret = 回调(self._dt)
_refresh_line_options 中的文件“/usr/local/lib/python2.7/dist-packages/kivy/uix/textinput.py”,第 1512 行
self._refresh_text_from_property()
_refresh_text_from_property 中的文件“/usr/local/lib/python2.7/dist-packages/kivy/uix/textinput.py”,第 1531 行
self._refresh_text(self._get_text(encode=False), *largs)
_refresh_text 中的文件“/usr/local/lib/python2.7/dist-packages/kivy/uix/textinput.py”,第 1551 行
_line_rects.append(矩形(size=lbl.size))
AttributeError:“NoneType”对象没有属性“大小”

我目前正在研究 kivy 的 rtl 支持。 所以我计划首先在 c(cython) 中实现一个重塑器。 有什么建议吗?

c 中没有整形器,但您可以使用 cython 和 python 阿拉伯语整形器和比迪

我认为像 algin 属性这样的小部件应该有一些变化
我正在处理小部件 algin 支持

我想我必须用 0 替换 windows x

唯一的困难是多行文本输入、选择和标记。 LabelBase 的类(SDL、PyGame 和 Pil)很容易做到这一点。

@pylover你有什么结果吗? 很高兴继续前进:)

有趣,但我没有时间。
我计划在下个月与 kivy 合作一个项目。 我认为这是我这样做的好机会。

我现在才开始。 我爱kivy

跟随

你好
感谢所有的想法
但是有问题没有解决
问题是:当我将 .py 文件转换为 .apk 文件时,我发现新问题是 android 系统中 textinput 的编码是 'str' 并且类型是十六进制但 reshaper 得到 unicode utf-8
现在我如何将其转换为 unicode 进行整形?

@motad333 ,我不知道。kivy 的核心开发人员可能会帮助你。

此问题已自动标记为过时,因为它最近没有活动。 如果没有进一步的活动,它将被关闭。 感谢你的贡献。

光标在波斯语/阿拉伯语文本输入上有一个错误,在 SDL 解决此问题之前它不会工作。
问题来自 kivy.core.label.LabelBase.get_extents()。 它已在 pygame、PIL 和 SDL 中实现。 由于 pygame 和 PIL 使用 SDL2 ttf,这些提供程序的 LabelBase 实现也有问题。

kivy_input

我的 fork 包含对 farsi/arabic Label/Button 的修复,但用户必须将 font_name 更改为有效的 farsi/arabic font_name,因为默认字体不适用于 farsi。 如果你愿意,我可以创建一个 PR。

编辑:我试图找到 SDL2 的阿拉伯语/波斯语渲染问题,但我以前没有关于字体/文本渲染如何工作的经验。

@RevengeComing ..嗨我想在我的应用程序中使用这个解决方案..你能告诉我怎么做吗

@engmms ,但这不是一个有效的解决方案,但你可以安装我的 fork:
pip install git+https://github.com/RevengeComing/kivy.git
(您可能需要安装 rtl、arabic_reshaper、python-bidi ,使用 pip 安装它们)

而且您必须在您的应用程序中添加一个波斯语/阿拉伯语字体,并将标签/按钮/文本输入的所有 font_name 更改为您的字体,因为默认字体不支持波斯语/阿拉伯语。

我正在为 harfbuzz 库创建一个 python 绑定,以在 kivy 中使用它的文本字形信息,这样我们就可以使用它提供给我们的细节来推进光标。 通过混合使用 python-bidi 和pyharfbuzz ,我们可以为 kivy 提供多语言支持。

再一次问好,

为了解决这个问题,我创建了kivy_i18n存储库:

结果是:
peek 2018-01-22 16-23

它需要pyharfbuzzpython-fribidi ,目前只支持 linux(py3, py2) 和 mac(py3) 以及 harfbuzz, fribidi, freetype2。

TextInput 有一些问题,比如不是 rtl 和......但我会在其中添加这些功能。

好的@RevengeComing ...谢谢你的硬词..

@RevengeComing ...我会测试这个解决方案

现在使用 KIVY_TEXT=pango 在 master 中提供实验性支持

虽然,据我所知,这个解决方案只适用于 Linux 和 OSX,但它肯定需要做更多的工作才能在 Windows 和移动平台上运行。

@RevengeComing @tshirtman嗨,伙计,怎么了? 此功能是否已准备好集成到移动和 Windows 应用程序中?我现在真正关心的是 Android 而不是 Windows。 波斯语/波斯语使用者的一个愚蠢的解决方法是使用 Finglish。 :)

此页面是否有帮助?
0 / 5 - 0 等级