使用 GTK TextView 撤消
-
09-06-2019 - |
题
我试图将我贡献的程序的依赖性保持在最低限度,它是一个小型文本编辑器。
GTK Textview 似乎没有内置撤消功能。到目前为止我还缺少任何参考实现吗?每个人都为他们的 TextView 小部件编写自己的撤消函数吗?
我会对任何示例代码感到高兴 - 最满意的是 python 示例代码,因为我们的项目是用 python 编写的。
解决方案
据我所知,GTK TextView 不包含撤消功能。因此,虽然我不熟悉 Python 的 GTK 库,但我认为它没有。
Ruby-GNOME2 项目有一个 示例文本编辑器 具有撤消/重做功能。基本上,它们连接到 TextView 小部件的 insert_text 和 delete_range 信号,并将事件和关联数据记录在列表中。
其他提示
作为后续:我将gtksourceview的undo机制移植到了python中: http://bitbucket.org/tiax/gtk-textbuffer-with-undo/
用作 gtksourceview 撤消功能的直接替代品
(OP在这里,但启动板开放ID不再工作)
使用Gtk源
- https://wiki.gnome.org/Projects/GtkSourceView
- https://lazka.github.io/pgi-docs/GtkSource-3.0/
- https://lazka.github.io/pgi-docs/GtkSource-3.0/classes.html
.
- [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()
不隶属于 StackOverflow