Kivy: entrada de texto árabe

Creado en 19 oct. 2013  ·  38Comentarios  ·  Fuente: kivy/kivy

¿Cómo puedo convertir texto en tiempo de escritura? http://postimg.org/image/u40ftpwm9/ http://postimg.org/image/ibefw8b89/ como puede ver cuando escribo kivy, la palabra está fuera de forma, así que usé "remodelador árabe" para solucionar este problema . ahora puedo usar el botón convertir para arreglarlo, pero ¿cómo debo arreglar esto al escribir sin presionar el botón convertir?

¿Quieres respaldar este problema? ¡Pon una recompensa por ello! Aceptamos recompensas a través de Bountysource .

Has PR Feature

Comentario más útil

Estoy creando un enlace de python para la biblioteca harfbuzz para usar su información de glifo de texto dentro de kivy para que podamos avanzar el cursor con los detalles que nos brinda. con una mezcla de python-bidi y pyharfbuzz podemos tener soporte multilingüe para kivy.

Todos 38 comentarios

Intente preprocesar la entrada anulando insert_text y pasando el texto a través del remodelador árabe.

Esto seguiría siendo un truco y necesitamos el soporte adecuado para los idiomas de derecha a izquierda, las contribuciones/solicitudes de extracción siempre son bienvenidas, ayudaría si alguien familiarizado con los idiomas RtoL pudiera dedicar tiempo a esto.

tnx por tu respuesta. Encontré este "insert_text(substring, from_undo=False)" en la referencia api, ¿puede darme un ejemplo simple de cómo usarlo? Soy muy nueva en kivy.

¿Y es posible usar halign para rtl en la entrada de texto?

TextInput aún no admite la alineación, es decir, dije que en realidad necesitamos el soporte adecuado para los lenguajes RtoL.

está bien . ¿Qué pasa con el ejemplo insert_text?

tnx, escribo esto en mi main.py, entonces, ¿cómo puedo decirle a kivy que lo use para ingresar texto?

mi main.py es:

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

Cambié kivy.uix.textinput.py a esto:

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

y ahora no tiene problemas para mostrar árabe y farsi, pero lo cambio en el núcleo kivy y no es una buena manera. ¿Cómo puedo forzar la entrada de texto para usar mi clase de texto de entrada dentro de mi aplicación? como dije soy muy nueva en kivy

Bueno, tal vez sería bueno hacer una PR de ese cambio. Eso agrega un
dependencia de kivy al remodelador árabe, pero necesitamos internacionalización
de todos modos, a menos que haya una mejor manera de hacerlo, creo que es la forma
hacia adelante.

Al menos debería ser discutido.

Si quieres hacerlo solo para tu aplicación, puedes hacer una clase

clase BidiTextInput(TextInput):
def _create_line_label(self, texto, sugerencia=Falso):
texto_reformado = arabic_reshaper.reshape(texto)
texto = get_display(remodelado_texto)
super(BidiTextInput, self)._create_line_label(texto, pista)

y use esta clase en lugar de TextInput en el resto de su código. (en kv
y python, llame a BidiTextInput en lugar de TextInput, cada vez que necesite
eso). (BidiTextInput puede no ser un gran nombre, tengo mucha imaginación
ahora :P)

Pero creo que sería una buena adición a Kivy.

El domingo 20 de octubre de 2013 a las 03:16:32 AM -0700, Nima escribió:

Cambié kivy.uix.textinput.py a esto :+1:
def _create_line_label(self, texto, sugerencia=Falso):
texto_reformado = arabic_reshaper.reshape(texto)
texto = get_display(remodelado_texto)
y ahora no tiene problemas con el árabe y el farsi, pero lo cambio en el núcleo kivy y no es una buena manera. ¿Cómo puedo forzar la entrada de texto para usar mi clase de texto de entrada en mi aplicación? como dije soy muy nueva en kivy


Responda a este correo electrónico directamente o véalo en GitHub:
https://github.com/kivy/kivy/issues/1570#issuecomment-26670261

gracias hay otro problema con la derecha a la izquierda y tengo que trabajar en eso

Entiendo que está funcionando ahora, ¿PR? :PAGS

El lunes 21 de octubre de 2013 a las 12:25:13 AM -0700, Nima escribió:

gracias hay otro problema de derecha a izquierda y estoy trabajando en eso


Responda a este correo electrónico directamente o véalo en GitHub:
https://github.com/kivy/kivy/issues/1570#issuecomment-26697061

Sigo trabajando de derecha a izquierda, mi solución es obtener la posición del cursor y la resolución de la pantalla y usar la pestaña para mover la palabra al lugar correcto. ¿Tienes una mejor idea?

¡Oye! ¿Dónde puedo encontrar remodelador árabe?

¡Oye! ¿Dónde puedo encontrar remodelador árabe?

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

¿Quieres la versión haxe?
El 5 de agosto de 2014 a las 19:32, "Kashif Iftikhar" [email protected] escribió:

¡Oye! ¿Dónde puedo encontrar remodelador árabe?

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


Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/kivy/kivy/issues/1570#issuecomment-51223419 .

para la entrada de texto no funcionará

def _create_line_label(self, texto, sugerencia=Falso):
texto_reformado = arabic_reshaper.reshape(texto)
texto = get_display(remodelado_texto)
agregarlo a TextInput obtendrá:
Rastreo (llamadas recientes más última):
Archivo "/home/sajad/PycharmProjects/kimiastone/Persian.py", línea 112, en
miAplicación().ejecutar()
Archivo "/usr/local/lib/python2.7/dist-packages/kivy/app.py", línea 824, en ejecución
ejecutar la aplicación táctil ()
Archivo "/usr/local/lib/python2.7/dist-packages/kivy/base.py", línea 487, en runTouchApp
EventLoop.window.mainloop()
Archivo "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_pygame.py", línea 401, en mainloop
self._mainloop()
Archivo "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_pygame.py", línea 288, en _mainloop
Bucle de eventos.idle()
Archivo "/usr/local/lib/python2.7/dist-packages/kivy/base.py", línea 327, inactivo
Reloj.tick()
Archivo "/usr/local/lib/python2.7/dist-packages/kivy/clock.py", línea 483, en tick
self._process_events()
Archivo "/usr/local/lib/python2.7/dist-packages/kivy/clock.py", línea 615, en _process_events
event.tick(self._last_tick, eliminar)
Archivo "/usr/local/lib/python2.7/dist-packages/kivy/clock.py", línea 374, en tick
ret = devolución de llamada (self._dt)
Archivo "/usr/local/lib/python2.7/dist-packages/kivy/uix/textinput.py", línea 1512, en _refresh_line_options
self._refresh_text_from_property()
Archivo "/usr/local/lib/python2.7/dist-packages/kivy/uix/textinput.py", línea 1531, en _refresh_text_from_property
self._refresh_text(self._get_text(codificar=Falso), *largos)
Archivo "/usr/local/lib/python2.7/dist-packages/kivy/uix/textinput.py", línea 1551, en _refresh_text
_line_rects.append(Rectángulo(tamaño=lbl.tamaño))
AttributeError: el objeto 'NoneType' no tiene atributo 'size'

Actualmente estoy trabajando en el soporte rtl de kivy. así que planeo comenzar implementando un remodelador en c(cython) . cualquier sugerencia ?

no hay remodelador en c, pero puede usar el remodelador árabe cython y python y bidi

creo que debería haber algunos cambios en el widget como la propiedad algin
estoy trabajando en el soporte de algin de widgets

creo que tengo que reemplazar windows x con 0

La única dificultad es la entrada de texto de varias líneas, la selección y las marcas. Las clases de LabelBase (SDL, PyGame y Pil) son fáciles de hacer.

Hola @pylover , ¿obtuviste algún resultado? Sería bueno seguir adelante con esto :)

Interesante, pero no tengo tiempo.
Estoy planeando un proyecto con kivy el próximo mes. Creo que es una buena oportunidad para mí hacer eso.

Estoy empezando ahora mismo. amo a kivy

seguir

hola
gracias por toda la idea
pero hay un problema que no se resuelve
y el problema es: cuando convierto un archivo .py en un archivo .apk, encuentro un nuevo problema que es la codificación de la entrada de texto en el sistema Android es 'str' y el tipo es hexadecimal pero el remodelador obtiene unicode utf-8
Ahora, ¿cómo puedo convertirlo a Unicode para remodelar?

@ motad333 , no tengo idea. Los desarrolladores principales de kivy pueden ayudarlo.

Este problema se ha marcado automáticamente como obsoleto porque no ha tenido actividad reciente. Se cerrará si no se produce más actividad. Gracias por sus aportaciones.

El cursor tiene un error en la entrada de texto farsi/árabe y no funcionará hasta que SDL solucione este problema.
El problema surge de kivy.core.label.LabelBase.get_extents(). se ha implementado en pygame, PIL y SDL. dado que pygame y PIL usan SDL2 ttf, la implementación de LabelBase de estos proveedores también tiene problemas.

kivy_input

Mi bifurcación contiene una corrección para la etiqueta/botón farsi/árabe, pero el usuario tiene que cambiar font_name a un farsi/arabic font_name válido, ya que la fuente predeterminada no funciona para farsi. Puedo crear un PR si quieres.

Editar: trato de encontrar el problema de SDL2 con la representación en árabe/farsi, pero no tengo experiencia previa sobre cómo funciona la representación de fuente/texto.

@RevengeComing ... hola, quiero usar esta solución en mi aplicación... ¿pueden decirme cómo?

@engmms , aunque no es una solución válida, pero puedes instalar mi bifurcación:
pip install git+https://github.com/RevengeComing/kivy.git
(es posible que deba instalar rtl, arabic_reshaper, python-bidi, instálelos con pip)

Y debe agregar una fuente farsi/árabe a su aplicación y cambiar todo el nombre de fuente de sus etiquetas/botones/entradas de texto a su fuente, ya que la fuente predeterminada no es compatible con farsi/árabe.

Estoy creando un enlace de python para la biblioteca harfbuzz para usar su información de glifo de texto dentro de kivy para que podamos avanzar el cursor con los detalles que nos brinda. con una mezcla de python-bidi y pyharfbuzz podemos tener soporte multilingüe para kivy.

Hola de nuevo,

Creé el repositorio kivy_i18n para resolver este problema:

El resultado es:
peek 2018-01-22 16-23

Requiere pyharfbuzz y python-fribidi, que solo admite linux (py3, py2) y mac (py3) en este momento, así como harfbuzz, fribidi, freetype2.

TextInput tiene algunos problemas como no ser rtl y ... pero le agregaré estas características.

ok @RevengeComing... gracias por tu dura palabra...

@RevengeComing ...Probaré esta solución

Un soporte experimental ahora está disponible en el maestro usando KIVY_TEXT=pango

Aunque, hasta donde yo sé, esta solución solo funciona en Linux y OSX, sin duda se necesita más trabajo para que funcione en Windows y plataformas móviles.

@RevengeComing @tshirtman Hola amigo, ¿qué pasa? ¿Esta función está lista para integrarse en aplicaciones móviles y de Windows? En este momento, estoy realmente preocupado por Android en lugar de Windows. Una solución tonta para los hablantes de persa/farsi es usar finlandés. :)

¿Fue útil esta página
0 / 5 - 0 calificaciones