Отменить с помощью GTK TextView

Я пытаюсь свести зависимости к минимуму для программы, в которую я участвую, это небольшой текстовый редактор.

GTK Textview, похоже, не имеет встроенной функции отмены. Есть ли какая-нибудь эталонная реализация, которой мне пока не хватало? Каждый ли пишет свою собственную функцию отмены для своих виджетов TextView?

Я буду рад любому образцу кода - больше всего рад образцу кода Python, так как наш проект находится на Python.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
10
0
3 080
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Насколько мне известно, GTK TextView не включает функцию отмены. Так что, хотя я не знаком с библиотекой Python GTK, я бы подумал, что у нее ее нет.

Проект Ruby-GNOME2 имеет образец текстового редактора, который имеет функции отмены / повтора. В основном они подключаются к сигналам insert_text и delete_range виджета TextView и записывают события и связанные данные в список.

В зависимости от того, насколько вы не склонны к зависимостям и какой текстовый редактор вы создаете, GtkSourceView добавляет отмену / повтор среди многих других вещей. Очень стоит посмотреть, если вам нужны другие Особенности, которые он предлагает.

в качестве следующего: я портировал механизм отмены gtksourceview на python: http://bitbucket.org/tiax/gtk-textbuffer-with-undo/

служит заменой для отмены gtksourceview

(OP здесь, но open-id панели запуска больше не работает)

Используйте GtkSource

.

  • [Cmnd] + [Z] для отмены (по умолчанию)
  • [Cmnd] + [Shift] + [Z] для повтора (по умолчанию)
  • [Cmnd] + [Y] для повтора (добавлено вручную)

пример:

#!/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()
    

Другие вопросы по теме