Kivy: アラビア語のテキスト入力

作成日 2013年10月19日  ·  38コメント  ·  ソース: kivy/kivy

入力時にテキストを変換するにはどうすればよいですか? http://postimg.org/image/u40ftpwm9/ http://postimg.org/image/ibefw8b89/ kivyと入力すると単語の形が崩れているので、この問題を修正するために「アラビア語のリシェーパー」を使用しました。 。 これで、変換ボタンを使用して修正できますが、変換ボタンを押さずに入力時にこれを修正するにはどうすればよいですか?

この問題を支持したいですか? それに賞金を投稿してください! Bountysourceを介して報奨金を受け取ります。

Has PR Feature

最も参考になるコメント

harfbuzzライブラリのPythonバインディングを作成して、kivy内のテキストグリフ情報を使用します。これにより、カーソルを詳細に進めることができます。 python-bidiとpyharfbuzzを組み合わせることで、kivyの多言語サポートを利用できます。

全てのコメント38件

insert_textをオーバーライドし、テキストをアラビア語のre-shaperに渡すことにより、入力を前処理してみてください。

これはまだハックであり、右から左への言語の適切なサポートが必要です。投稿/プルリクエストはいつでも歓迎です。RtoL言語に精通している人がこれに時間を割けると助かります。

あなたの答えのためのtnx。 API refrenceでこの「insert_text(substring、from_undo = False)」を見つけました。簡単な使用例を教えてください。 私はkivyがとても新しいです。

これは、テキスト入力でrtlにhalignを使用することは可能ですか?

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で非常に新しいです

ええと、多分その変更のPRをするのはいいでしょう? それは追加します
kivyはアラビア語のリシェーパーに依存していますが、国際化が必要です
とにかく、それを行うためのより良い方法がない限り、私はそれが方法だと思います
前方。

少なくともそれは議論されるべきです。

アプリケーションに対してのみ実行したい場合は、クラスを実行できます

クラスBidiTextInput(TextInput):
def _create_line_label(self、text、hint = False):
reshape_text = arabic_reshaper.reshape(text)
text = get_display(reshape_text)
super(BidiTextInput、self)._ create_line_label(text、hint)

コードの残りの部分では、TextInputの代わりにこのクラスを使用します。 (kvで
とpython、必要なときはいつでも、TextInputの代わりにBidiTextInputを呼び出します
それ)。 (BidiTextInputは素晴らしい名前ではないかもしれません、私は湖の想像力です
今:P)

しかし、私はそれがkivyへの素晴らしい追加になると思います。

2013年10月20日03:16:32 AM -0700の日曜日、ニマは次のように書いています。

kivy.uix.textinput.pyをこれに変更しました:+1:
def _create_line_label(self、text、hint = False):
reshape_text = arabic_reshaper.reshape(text)
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 AM -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分、「KashifIftikhar」 [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)
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()
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
self._mainloop()
ファイル "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_pygame.py"、行288、_mainloop
EventLoop.idle()
ファイル "/usr/local/lib/python2.7/dist-packages/kivy/base.py"、行327、アイドル状態
Clock.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、remove)
ファイル「/usr/local/lib/python2.7/dist-packages/kivy/clock.py」、374行目、目盛り
ret = callback(self._dt)
ファイル "/usr/local/lib/python2.7/dist-packages/kivy/uix/textinput.py"、1512行目、_refresh_line_options
self._refresh_text_from_property()
ファイル "/usr/local/lib/python2.7/dist-packages/kivy/uix/textinput.py"、1531行目、_refresh_text_from_property
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(Rectangle(size = lbl.size))
AttributeError: 'NoneType'オブジェクトに属性 'size'がありません

私は現在、kivyのrtlサポートに取り組んでいます。 だから私はc(cython)にリシェイパーを実装することから始めるつもりです。 なにか提案を ?

cにはリシェイパーはありませんが、cythonとpythonのアラビア語のリシェイパーとbidiを使用できます。

アルギンプロパティのようなウィジェットにいくつかの変更があるはずだと思います
ウィジェットアルギンサポートに取り組んでいるim

私は窓xを0に置き換える必要があると思います

唯一の難しさは、複数行のテキスト入力、選択、およびマークアップです。 LabelBaseのクラス(SDL、PyGame、Pil)はそれを簡単に行うことができます。

ねえ@pyloverあなたはいくつかの結果を得ましたか? これを進めていくといいでしょう:)

面白いですが、時間がありません。
来月にはkivyを使ったプロジェクトを計画しています。 それをする良いチャンスだと思います。

私は今始めています。 私はkivyが大好きです

従う

こんにちは
すべてのアイデアに感謝します
しかし、解決されていない問題があります
問題は次のとおりです。.pyファイルを.apkファイルに変換すると、Androidシステムでのテキスト入力のエンコードが「str」でタイプが16進数であるという新しい問題が見つかりますが、リシェーパーはユニコードutf-8を取得します
今、どうすればそれをリシェーパー用のユニコードに変換できますか?

@ motad333 、私にはわかりません。kivyのコア開発者があなたを助けるかもしれません。

この問題は、最近のアクティビティがないため、自動的に古いものとしてマークされています。 それ以上のアクティビティが発生しない場合は閉じられます。 貢献していただきありがとうございます。

カーソルにはペルシア語/アラビア語のテキスト入力に関するバグがあり、SDLがこの問題を修正するまで機能しません。
問題はkivy.core.label.LabelBase.get_extents()から発生します。 pygame、PIL、S​​DLに実装されています。 pygameとPILはSDL2ttfを使用しているため、これらのプロバイダーのLabelBase実装にも問題があります。

kivy_input

私のフォークには、ペルシア語/アラビア語のラベル/ボタンの修正が含まれていますが、デフォルトのフォントはペルシア語では機能しないため、ユーザーはfont_nameを有効なペルシア語/アラビア語のfont_nameに変更する必要があります。 必要に応じてPRを作成できます。

編集:アラビア語/ペルシア語のレンダリングに関するSDL2の問題を見つけようとしましたが、フォント/テキストのレンダリングがどのように機能するかについてはこれまでの経験がありません。

@RevengeComing ..こんにちは私は私のアプリでこのソリューションを使用したいです..方法を教えてください

@engmms 、それでもそれは有効な解決策ではありませんが、私のフォークをインストールすることができます:
pip install git+https://github.com/RevengeComing/kivy.git
(rtl、arabic_reshaper、python-bidiをインストールし、pipでインストールする必要がある場合があります)

また、デフォルトのフォントはペルシア語/アラビア語をサポートしていないため、アプリケーションにペルシア語/アラビア語フォントを追加し、Labels / Buttons / TextInputsのすべてのfont_nameをフォントに変更する必要があります。

harfbuzzライブラリのPythonバインディングを作成して、kivy内のテキストグリフ情報を使用します。これにより、カーソルを詳細に進めることができます。 python-bidiとpyharfbuzzを組み合わせることで、kivyの多言語サポートを利用できます。

また会いましたね、

この問題を解決するために、 kivy_i18nリポジトリを作成しました。

結果は次のとおりです。
peek 2018-01-22 16-23

現在、linux(py3、py2)とmac(py3)、およびharfbuzz、fribidi、freetype2のみをサポートするpyharfbuzzpython-fribidiが必要です。

TextInputには、rtlではないなどの問題があります...しかし、これらの機能を追加します。

わかりました@RevengeComing ...あなたの難しい言葉に感謝します..

@RevengeComing ...このソリューションをテストします

KIVY_TEXT = pangoを使用してマスターで実験的なサポートが利用可能になりました

私の知る限り、このソリューションはLinuxとOSXでのみ機能しますが、Windowsとモバイルプラットフォームで機能するには、さらに多くの作業が必要です。

@RevengeComing @tshirtmanこんにちはバディ、どうしたの? この機能はモバイルおよびWindowsアプリケーションに統合する準備ができていますか?私は今、WindowsではなくAndroidに本当に関心があります。 ペルシア語/ペルシア語スピーカーの愚かな回避策の1つは、Finglishを使用することです。 :)

このページは役に立ちましたか?
0 / 5 - 0 評価