2008-09-16 52 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()