Kivy: saisie de texte arabe

Créé le 19 oct. 2013  ·  38Commentaires  ·  Source: kivy/kivy

comment puis-je convertir du texte en temps de frappe? http://postimg.org/image/u40ftpwm9/ http://postimg.org/image/ibefw8b89/ comme vous pouvez le voir quand je tape kivy le mot est hors de forme donc j'ai utilisé "reshaper arabe" pour résoudre ce problème . maintenant, je peux utiliser le bouton de conversion pour le réparer, mais comment dois-je résoudre ce problème en tapant du temps sans appuyer sur le bouton de conversion?

Vous voulez soutenir ce problème ? Publiez une prime dessus ! Nous acceptons les primes via Bountysource .

Has PR Feature

Commentaire le plus utile

Je crée une liaison python pour la bibliothèque harfbuzz afin d'utiliser ses informations de glyphe de texte à l'intérieur de kivy afin que nous puissions faire avancer le curseur avec les détails qu'il nous donne. avec un mélange de python-bidi et pyharfbuzz , nous pouvons avoir un support multilingue pour kivy.

Tous les 38 commentaires

Essayez de pré-traiter l'entrée en remplaçant le insert_text et en passant le texte à travers le remodelage arabe.

Ce serait toujours un hack et nous avons besoin d'un support approprié pour les langues de droite à gauche, les contributions/demandes d'extraction sont toujours les bienvenues, cela aiderait si certains familiers avec les langues RtoL pouvaient consacrer du temps à cela.

tnx pour votre réponse. J'ai trouvé ce "insert_text(substring, from_undo=False)" dans la référence api pouvez-vous me donner un exemple simple d'utilisation ? Je suis tout nouveau à Kivy.

et est-il possible d'utiliser halign pour rtl dans la saisie de texte ?

TextInput ne prend pas encore en charge l'alignement, c'est pourquoi j'ai déclaré que nous avions réellement besoin d'un support approprié pour les langages RtoL.

d'accord . qu'en est-il de l'exemple insert_text ?

tnx J'écris ceci dans mon main.py alors comment puis-je dire à kivy de l'utiliser pour la saisie de texte?

mon main.py est:

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()

J'ai changé kivy.uix.textinput.py en ceci :

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

et maintenant il n'a aucun problème à montrer l'arabe et le farsi mais je le change dans le noyau kivy et ce n'est pas une bonne façon. comment puis-je forcer la saisie de texte à utiliser ma classe de texte d'entrée dans mon application ? comme je l'ai dit, je suis très nouveau dans kivy

Eh bien, peut-être que ce serait bien de faire un PR de ce changement ? Cela ajoute un
dépendance du kivy au remodeleur arabe, mais nous avons besoin d'internationalisation
de toute façon, donc à moins qu'il n'y ait une meilleure façon de le faire, je pense que c'est la façon
effronté.

Il faudrait au moins en discuter.

Si vous voulez le faire uniquement pour votre application, vous pouvez faire une classe

classe BidiTextInput(TextInput):
def _create_line_label(self, text, hint=False) :
reshape_text = arabic_reshaper.reshape(texte)
texte = get_display(texte_refaçonné)
super(BidiTextInput, soi)._create_line_label(texte, indice)

et utilisez cette classe au lieu de TextInput dans le reste de votre code. (en kv
et python, appelez BidiTextInput au lieu de TextInput, chaque fois que vous avez besoin
ce). (BidiTextInput n'est peut-être pas un grand nom, je manque d'imagination
maintenant :P)

Mais je pense que ce serait un bon ajout à kivy.

Le dimanche 20 octobre 2013 à 03:16:32 -0700, Nima a écrit :

J'ai changé kivy.uix.textinput.py en ceci :+1:
def _create_line_label(self, text, hint=False) :
reshape_text = arabic_reshaper.reshape(texte)
texte = get_display(texte_refaçonné)
et maintenant il n'a aucun problème avec l'arabe et le farsi mais je le change dans le noyau kivy et ce n'est pas un bon moyen. comment puis-je forcer la saisie de texte à utiliser ma classe de texte d'entrée dans mon application ? comme je l'ai dit, je suis très nouveau dans kivy


Répondez directement à cet e-mail ou consultez-le sur GitHub :
https://github.com/kivy/kivy/issues/1570#issuecomment -26670261

merci. il y a un autre problème de droite à gauche et je dois y travailler

Je comprends que ça marche maintenant, PR ? :P

Le lundi 21 octobre 2013 à 00:25:13 -0700, Nima a écrit :

merci. il y a un autre problème de droite à gauche et j'y travaille


Répondez directement à cet e-mail ou consultez-le sur GitHub :
https://github.com/kivy/kivy/issues/1570#issuecomment -26697061

Je travaille toujours de droite à gauche, ma solution consiste à obtenir la position du curseur et la résolution de l'écran et à utiliser l'onglet pour déplacer le mot au bon endroit. As-tu une meilleure idée?

Hé! Où puis-je trouver un remodeleur arabe ?

Hé! Où puis-je trouver un remodeleur arabe ?

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

Voulez-vous la version hache ?
Le 5 août 2014 à 19h32, "Kashif Iftikhar" [email protected] a écrit :

Hé! Où puis-je trouver un remodeleur arabe ?

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


Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/kivy/kivy/issues/1570#issuecomment -51223419.

pour la saisie de texte, cela ne fonctionnera pas

def _create_line_label(self, text, hint=False) :
reshape_text = arabic_reshaper.reshape(texte)
texte = get_display(texte_refaçonné)
l'ajouter à TextInput obtiendra :
Traceback (dernier appel le plus récent) :
Fichier "/home/sajad/PycharmProjects/kimiastone/Persian.py", ligne 112, dans
monApp().run()
Fichier "/usr/local/lib/python2.7/dist-packages/kivy/app.py", ligne 824, en cours
runTouchApp()
Fichier "/usr/local/lib/python2.7/dist-packages/kivy/base.py", ligne 487, dans runTouchApp
EventLoop.window.mainloop()
Fichier "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_pygame.py", ligne 401, dans la boucle principale
self._mainloop()
Fichier "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_pygame.py", ligne 288, dans _mainloop
EventLoop.idle()
Fichier "/usr/local/lib/python2.7/dist-packages/kivy/base.py", ligne 327, inactif
Horloge.tick()
Fichier "/usr/local/lib/python2.7/dist-packages/kivy/clock.py", ligne 483, en coche
self._process_events()
Fichier "/usr/local/lib/python2.7/dist-packages/kivy/clock.py", ligne 615, dans _process_events
event.tick(self._last_tick, supprimer)
Fichier "/usr/local/lib/python2.7/dist-packages/kivy/clock.py", ligne 374, en coche
ret = rappel(self._dt)
Fichier "/usr/local/lib/python2.7/dist-packages/kivy/uix/textinput.py", ligne 1512, dans _refresh_line_options
self._refresh_text_from_property()
Fichier "/usr/local/lib/python2.7/dist-packages/kivy/uix/textinput.py", ligne 1531, dans _refresh_text_from_property
self._refresh_text(self._get_text(encode=False), *largs)
Fichier "/usr/local/lib/python2.7/dist-packages/kivy/uix/textinput.py", ligne 1551, dans _refresh_text
_line_rects.append(Rectangle(taille=lbl.taille))
AttributeError : l'objet 'NoneType' n'a pas d'attribut 'taille'

Je travaille actuellement sur le support rtl de kivy. donc je prévois de commencer par implémenter un reshaper dans c(cython) . toute suggestion ?

il n'y a pas de reshaper en c mais vous pouvez utiliser cython et python arabic reshaper et bidi

je pense qu'il devrait y avoir quelques changements dans le widget comme la propriété algin
je travaille sur le support du widget algin

je pense que je dois remplacer windows x par 0

La seule difficulté est la saisie de texte multiligne, la sélection et les balises. les classes de LabelBase (SDL, PyGame & Pil) sont faciles à faire.

@pylover avez-vous obtenu un résultat ? ce serait bien d'aller de l'avant :)

Intéressant, mais je n'ai pas le temps.
Je prévois un projet avec kivy le mois prochain. Je pense que c'est une bonne chance pour moi de le faire.

Je commence tout à l'heure. j'aime kivy

suivre

bonjour
merci pour toute idée
mais il y a un problème qui n'est pas résolu
et le problème est: lorsque je convertis le fichier .py en fichier .apk, je trouve un nouveau problème qui est l'encodage de l'entrée de texte dans le système Android est 'str' et le type est hexadécimal mais le remodeleur obtient unicode utf-8
maintenant, comment puis-je le convertir en unicode pour reshaper ??

@ motad333 , je n'en ai aucune idée. Les principaux développeurs de kivy peuvent vous aider.

Ce problème a été automatiquement marqué comme obsolète, car il n'a pas eu d'activité récente. Il sera fermé s'il n'y a plus d'activité. Merci pour vos contributions.

Le curseur a un bogue sur la saisie de texte farsi/arabe et il ne fonctionnera pas tant que SDL n'aura pas résolu ce problème.
Le problème vient de kivy.core.label.LabelBase.get_extents(). il a implémenté dans pygame, PIL et SDL. depuis que pygame et PIL utilisent SDL2 ttf, l'implémentation LabelBase de ces fournisseurs a également un problème.

kivy_input

Mon fork contient un correctif pour farsi/arabic Label/Button, mais l'utilisateur doit remplacer font_name par un farsi/arabic font_name valide, car la police par défaut ne fonctionne pas pour le farsi. Je peux créer un PR si vous le souhaitez.

Edit : J'essaie de trouver le problème de SDL2 avec le rendu arabe/farsi, mais je n'ai aucune expérience préalable sur le fonctionnement du rendu de police/texte.

@RevengeComing ..salut, je veux utiliser cette solution dans mon application..pouvez-vous me dire comment

@engmms , Pourtant ce n'est pas une solution valable mais vous pouvez installer mon fork :
pip install git+https://github.com/RevengeComing/kivy.git
(vous devrez peut-être installer rtl, arabic_reshaper, python-bidi , installez-les avec pip)

Et vous devez ajouter une police farsi/arabe à votre application et changer tous les font_name de vos Labels/Buttons/TextInputs à votre police car la police par défaut ne prend pas en charge le farsi/arabe.

Je crée une liaison python pour la bibliothèque harfbuzz afin d'utiliser ses informations de glyphe de texte à l'intérieur de kivy afin que nous puissions faire avancer le curseur avec les détails qu'il nous donne. avec un mélange de python-bidi et pyharfbuzz , nous pouvons avoir un support multilingue pour kivy.

Rebonjour,

J'ai créé le référentiel kivy_i18n afin de résoudre ce problème :

Le résultat est:
peek 2018-01-22 16-23

Il nécessite pyharfbuzz et python-fribidi qui ne supportent que linux(py3, py2) et mac(py3) pour le moment ainsi que harfbuzz, fribidi, freetype2.

TextInput a quelques problèmes comme ne pas être rtl et ... mais je vais y ajouter ces fonctionnalités.

ok @RevengeComing ... merci pour votre mot dur ..

@RevengeComing ... Je vais tester cette solution

Un support expérimental est maintenant disponible en master en utilisant KIVY_TEXT=pango

Bien que, pour autant que je sache, cette solution ne fonctionne que sur Linux et OSX, davantage de travail est certainement nécessaire pour qu'elle fonctionne sur Windows et les plates-formes mobiles.

@RevengeComing @tshirtman Salut mon pote, quoi de neuf ? Cette fonctionnalité est-elle prête à être intégrée dans les applications mobiles et Windows ? Je suis vraiment préoccupé par Android en ce moment plutôt que par Windows. Une solution de contournement idiote pour les locuteurs du persan/farsi consiste à utiliser le finglish. :)

Cette page vous a été utile?
0 / 5 - 0 notes