Pregunta

Estoy tratando de mantener las dependencias al mínimo para un programa en el que contribuyo, es un pequeño editor de texto.

GTK Textview no parece venir con una función de deshacer incorporada.¿Hay alguna implementación de referencia que me haya faltado hasta ahora?¿Están todos escribiendo su propia función de deshacer para sus widgets TextView?

Estaré feliz con cualquier código de muestra; lo más feliz con el código de muestra de Python, ya que nuestro proyecto está en Python.

¿Fue útil?

Solución

Hasta donde yo sé, GTK TextView no incluye una función de deshacer.Entonces, aunque no estoy familiarizado con la biblioteca GTK de Python, creo que no tiene ninguna.

El proyecto Ruby-GNOME2 tiene un editor de texto de muestra que tiene funcionalidad deshacer/rehacer.Básicamente, se conectan a las señales insert_text y delete_range del widget TextView y registran los eventos y los datos asociados en una lista.

Otros consejos

como seguimiento:Porté el mecanismo de deshacer de gtksourceview a Python: http://bitbucket.org/tiax/gtk-textbuffer-with-undo/

sirve como reemplazo directo para deshacer de gtksourceview

(OP aquí, pero open-id del launchpad ya no funciona)

Dependiendo de qué tan reacio a la dependencia sea y qué tipo de editor de texto esté creando, GtkSourceView agrega deshacer/rehacer entre muchas otras cosas.Vale la pena verlo si quieres algo del otro. características Ofrece.

Utilice GtkSource

.

  • [Cmnd] + [Z] para deshacer (predeterminado)
  • [Cmnd] + [Shift] + [Z] para rehacer (predeterminado)
  • [Cmnd] + [Y] para rehacer (agregado manualmente)

ejemplo:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk
gi.require_version('GtkSource', '3.0')
from gi.repository import GtkSource

import os


class TreeviewWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="TreeviewWindow")
        self.set_size_request(300, 300)
        self.connect("key-press-event", self._key_press_event)
        self.mainbox = Gtk.VBox(spacing=10)
        self.add(self.mainbox) 

        self.textbuffer = GtkSource.Buffer()
        textview = GtkSource.View(buffer=self.textbuffer)
        textview.set_editable(True)
        textview.set_cursor_visible(True)
        textview.set_show_line_numbers(True)
        self.mainbox.pack_start(textview, True, True, 0)
        self.show_all()  

    def _key_press_event(self, widget, event):
        keyval_name = Gdk.keyval_name(event.keyval)
        ctrl = (event.state & Gdk.ModifierType.CONTROL_MASK)
        if ctrl and keyval_name == 'y':
            if self.textbuffer.can_redo():
                self.textbuffer.do_redo(self.textbuffer)

    def main(self):
        Gtk.main()

if __name__ == "__main__":
    base = TreeviewWindow()
    base.main()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top