Cómo mover el cursor en una GTKTextView

📆 30 de marzo de 2016

Como parte del desarrollo de Panspeak, me decidí a incluir una ayuda para agregar las marcas de texto escrito y leído. Tras un poco de buceo en la documentación de GTK3 encontré la forma de introducir la secuencia #-|-# en el punto de edición del documento. El problema es que tras incluir la secuencia había que desplazarse manualmente al punto en el que comienza la parte para texto escrito.

Como me parecía un poco una chapuza, se me ocurrió que tras la inserción sería bueno que el cursor fuera automáticamente al punto de inserción del texto escrito, como ya he visto que hacen varios IDEs.

Esta vez el buceo fue bastante más prolongado y tras un par de días llegué a esta solución:

.. code-block::

def addMarker(self, widget): marker = “#-|-#” self.mybuffer.insert_at_cursor(marker) cursorPosition = self.mybuffer.get_property(“cursor-position”) myiter = self.mybuffer.get_iter_at_offset(cursorPosition - 3) self.mybuffer.place_cursor(myiter)

Lo que hago es calcular la posición en la que está el cursor después de insertar la marca con self.mybuffer.get_property("cursor-position"). Lamentablemente no hay algo tipo set_property() para fijar la nueva posición del cursor así que hay que obtener el iter de la posición del cursor quitando el número de caracteres que necesita retroceder, mediante self.mybuffer.get_iter_at_offset(cursorPosition - 3). Para finalizar, se lleva el cursor a ese nuevo punto mediante self.mybuffer.place_cursor(iter).

Probablemente no sea la forma más elegante de hacerlo pero parece que funciona, luego, de momento, se queda así.

Un saludo.

Como referencia

Para trabajar con textos utilizas un GTKTextView o un GTKSourceView. A esa vista se le asocia un buffer y las posiciones que necesitas en ese buffer vienen determinadas por los iters. Esos iters permiten definir marcas, regiones de texto, el texto completo, una posición concreta, etc.

Puedes compartir el enlace si te gustó: Cómo mover el cursor en una GTKTextView

También puedes dejarme un mensaje:





(Esto funciona gracias a Un-static Forms)