2008-09-16 26 views
9

我试图保持的依赖降到最低的程序我贡献,这是一个小的文本编辑器。撤消了GTK的TextView

GTK TextView中似乎没有拿出一个内置的撤消功能。到目前为止,我有没有参考实现?每个人都为自己的TextView小部件编写自己的撤消功能吗?

我会很高兴的任何代码示例 - 最高兴的事情Python示例代码,为我们的项目是蟒蛇。

回答

3

据我所知,GTK TextView中不包括撤销功能。所以虽然我不熟悉Python的GTK库,但我认为它没有。

红宝石GNOME2项目有sample text editor具有撤销/重做功能。基本上,它们连接到TextView小部件的insert_text和delete_range信号,并将事件和关联数据记录在列表中。

4

根据多么依赖厌恶你,什么样的你正在构建的文本编辑器,GtkSourceView增加撤消/在许多其他事情重做。非常值得一看,如果你想要一些其他的features它提供。

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()