10

我正在尝试将我贡献的程序的依赖关系降至最低,它是一个小型文本编辑器。

GTK Textview 似乎没有内置的撤消功能。到目前为止,我是否缺少任何参考实现?每个人都在为他们的 TextView 小部件编写自己的撤消功能吗?

我会对任何示例代码感到高兴——最高兴的是 python 示例代码,因为我们的项目是在 python 中。

4

4 回答 4

5

作为后续:我将 gtksourceview 的撤消机制移植到 python:http ://bitbucket.org/tiax/gtk-textbuffer-with-undo/

作为 gtksourceview 撤消的替代品

(此处为 OP,但启动板 open-id 不再起作用)

于 2009-02-25T14:09:27.493 回答
4

据我所知,GTK TextView 不包含撤消功能。因此,虽然我不熟悉 Python 的 GTK 库,但我认为它没有。

Ruby-GNOME2 项目有一个示例文本编辑器,它具有撤消/重做功能。基本上,它们连接到 TextView 小部件的 insert_text 和 delete_range 信号,并在列表中记录事件和相关数据。

于 2008-09-16T20:15:54.577 回答
4

根据您对依赖的厌恶程度以及您正在构建的文本编辑器类型,GtkSourceView添加了撤消/重做以及许多其他功能。如果您想要它提供的其他一些功能,非常值得一看。

于 2008-09-17T08:05:09.707 回答
0

使用 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()
    
于 2018-02-22T12:15:22.543 回答