문제
난을 유지하려고 종속성을 최소화를 위한 프로그램에 기여하는,그것은 작은 텍스트 편집기입니다.
GTK 뷰하지 않는 것으로 올 내장 취소 기능입니다.어떤 참조 구현 나는 누락에 지금까?은 모든 사람을 쓰는 자신의 취소 기능을 위해 자신의 텍스트 뷰 위젯?
나는 행복에 대한 모든 샘플 코드가 가장 행복에 대한 python 샘플 코드,우리의 프로젝트에서는 python.
해결책
내가 알기로서,사용자 인터페이스 그리고 스트링이 포함되지 않는 취소 기능입니다.하는 동안 그래서 나는 익숙하지 않 Python 의 프로그램 라이브러리,내가 생각하는 것 중 하나를 가지고 있지 않.
Ruby-GNOME2 프로젝트 샘플 텍스트 편집기 는 취소/다시 기능이 있습니다.기본적으로 그들은 연결하 insert_text 및 delete_range 신호의 뷰 위젯과 기록한 이벤트와 연결된 데이터에서는 목록이다.
다른 팁
로 follwow-up:이식 gtksourceview 의 취소 메커니즘을 python: http://bitbucket.org/tiax/gtk-textbuffer-with-undo/
를 제공합으로 대체하는 gtksourceview 의 실행 취소
(OP 여기에,하지만 실행 패드 오픈 id 더 이상 작동하지 않습니다)
에 따라 얼마나 종속성을 싫고,당신이 어떤 종류의 텍스트 편집기를 구축, GtkSourceView 추가/취소 사이에 다른 많은 것들입니다.매우 가치가있는 경우에 당신은 몇 가지의 다른 특징 그것을 제공합니다.
사용 GtkSource
- 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()